| 
                         但是,此时用户A存在于数据库A中,而新的MSSQL中虽然能创建用户A,但无法把权限赋于用户A。新创建一个用户B吧,用户A创建的表和其它信息就又无法访问。在这里找到了解决方法:  在源 SQL Server 上运行以下脚本。此脚本可在 master 数据库中创建名为 sp_hexadecimal 和 sp_help_revlogin 的两个存储过程。请在完成过程的创建之后继续执行第 2 步。  注意:下面的过程取决于 SQL Server 系统表。这些表的结构在 SQL Server 的不同版本之间可能会有变化,请不要直接从系统表中选择。  ----- Begin Script,Create sp_help_revlogin procedure -----  <div class="codetitle"><a style="CURSOR: pointer" data="66193" class="copybut" id="copybut66193" onclick="doCopy('code66193')"> 代码如下:<div class="codebody" id="code66193">  USE master  GO  IF OBJECT_ID ('sp_hexadecimal') IS NOT NULL  DROP PROCEDURE sp_hexadecimal  GO  CREATE PROCEDURE sp_hexadecimal  @binvalue varbinary(256), @hexvalue varchar(256) OUTPUT  AS  DECLARE @charvalue varchar(256)  DECLARE @i int  DECLARE @length int  DECLARE @hexstring char(16)  SELECT @charvalue = '0x'  SELECT @i = 1  SELECT @length = DATALENGTH (@binvalue)  SELECT @hexstring = '0123456789ABCDEF'  WHILE (@i <= @length)  BEGIN  DECLARE @tempint int  DECLARE @firstint int  DECLARE @secondint int  SELECT @tempint = CONVERT(int,SUBSTRING(@binvalue,@i,1))  SELECT @firstint = FLOOR(@tempint/16)  SELECT @secondint = @tempint - (@firstint16)  SELECT @charvalue = @charvalue +  SUBSTRING(@hexstring,@firstint+1,1) +  SUBSTRING(@hexstring,@secondint+1,1)  SELECT @i = @i + 1  END  SELECT @hexvalue = @charvalue  GO  IF OBJECT_ID ('sp_help_revlogin') IS NOT NULL  DROP PROCEDURE sp_help_revlogin  GO  CREATE PROCEDURE sp_help_revlogin @login_name sysname = NULL AS  DECLARE @name sysname  DECLARE @xstatus int  DECLARE @binpwd varbinary (256)  DECLARE @txtpwd sysname  DECLARE @tmpstr varchar (256)  DECLARE @SID_varbinary varbinary(85)  DECLARE @SID_string varchar(256)  IF (@login_name IS NULL)  DECLARE login_curs CURSOR FOR  SELECT sid,name,xstatus,password FROM master..sysxlogins  WHERE srvid IS NULL AND name <> 'sa'  ELSE  DECLARE login_curs CURSOR FOR  SELECT sid,password FROM master..sysxlogins  WHERE srvid IS NULL AND name = @login_name  OPEN login_curs  FETCH NEXT FROM login_curs INTO @SID_varbinary,@name,@xstatus,@binpwd  IF (@@fetch_status = -1)  BEGIN  PRINT 'No login(s) found.'  CLOSE login_curs  DEALLOCATE login_curs  RETURN -1  END  SET @tmpstr = '/ sp_help_revlogin script '  PRINT @tmpstr  SET @tmpstr = ' Generated '  + CONVERT (varchar,GETDATE()) + ' on ' + @@SERVERNAME + ' /'  PRINT @tmpstr  PRINT ''  PRINT 'DECLARE @pwd sysname'  WHILE (@@fetch_status <> -1)  BEGIN  IF (@@fetch_status <> -2)  BEGIN  PRINT ''  SET @tmpstr = '-- Login: ' + @name  PRINT @tmpstr  IF (@xstatus & 4) = 4  BEGIN -- NT authenticated account/group  IF (@xstatus & 1) = 1  BEGIN -- NT login is denied access  SET @tmpstr = 'EXEC master..sp_denylogin ''' + @name + ''''  PRINT @tmpstr  END  ELSE BEGIN -- NT login has access  SET @tmpstr = 'EXEC master..sp_grantlogin ''' + @name + ''''  PRINT @tmpstr  END  END  ELSE BEGIN -- SQL Server authentication  IF (@binpwd IS NOT NULL)  BEGIN -- Non-null password  EXEC sp_hexadecimal @binpwd,@txtpwd OUT  IF (@xstatus & 2048) = 2048  SET @tmpstr = 'SET @pwd = CONVERT (varchar(256),' + @txtpwd + ')'  ELSE  SET @tmpstr = 'SET @pwd = CONVERT (varbinary(256),' + @txtpwd + ')'  PRINT @tmpstr  EXEC sp_hexadecimal @SID_varbinary,@SID_string OUT  SET @tmpstr = 'EXEC master..sp_addlogin ''' + @name  + ''',@pwd,@sid = ' + @SID_string + ',@encryptopt = '  END  ELSE BEGIN  -- Null password  EXEC sp_hexadecimal @SID_varbinary,NULL,@encryptopt = '  END  IF (@xstatus & 2048) = 2048  -- login upgraded from 6.5  SET @tmpstr = @tmpstr + '''skip_encryption_old'''  ELSE  SET @tmpstr = @tmpstr + '''skip_encryption'''  PRINT @tmpstr  END  END  FETCH NEXT FROM login_curs INTO @SID_varbinary,@binpwd  END  CLOSE login_curs  DEALLOCATE login_curs  RETURN 0  GO    ----- End Script -----  2. 在创建 sp_help_revlogin 存储过程后,请从源服务器上的查询分析器中运行 sp_help_revlogin 过程。sp_help_revlogin 存储过程可同时用于 SQL Server 7.0 和 SQL Server 2000。sp_help_revlogin 存储过程的输出是登录脚本,该脚本可创建带有原始 SID 和密码的登录。保存输出,然后将其粘贴到目标 SQL Server 上的查询分析器中,并运行它。例如:EXEC master..sp_help_revlogin  <div class="codetitle"><a style="CURSOR: pointer" data="57907" class="copybut" id="copybut57907" onclick="doCopy('code57907')"> 代码如下:<div class="codebody" id="code57907">SP_DEFAULTDB 'cyiyun','DB_WAYUP'  第1步后,在源服务器上运行sp_help_revlogin后,会产生创建用户数据的SQL,例如:  <div class="codetitle"><a style="CURSOR: pointer" data="35881" class="copybut" id="copybut35881" onclick="doCopy('code35881')"> 代码如下:<div class="codebody" id="code35881">  / sp_help_revlogin script   Generated 06 24 2009 1:40PM on WORKGROU-B1XTVC */  DECLARE @pwd sysname  -- Login: hxtest  SET @pwd = CONVERT (varbinary(256),0x0100CF4E7D342B359438E4BCCA72E6C83F44FCCF30C8016286DE2B359438E4BCCA72E6C83F44FCCF30C8016286DE)  EXEC master..sp_addlogin '520web',@sid = 0x1738BB6AD0CD24498F67FB5589E8EDCB,@encryptopt = 'skip_encryption'  ......    把这段直接在新服务器上运行,或者找到相应的用户名创建,就可以解决这个问题了!                         (编辑:莱芜站长网) 
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! 
                     |