分享、学习、提高
2009/06/24 13:42
文章作者:Enjoy 转载请注明原文链接。
数据库A有用户A,有一些用户A创建的表和SP。
迁移时将data目录下的MDF和LDF移到新的MSSQL服务器上,通过附加数据库的功能将数据库恢复。

但是,此时用户A存在于数据库A中,而新的MSSQL中虽然能创建用户A,但无法把权限赋于用户A。新创建一个用户B吧,用户A创建的表和其它信息就又无法访问。在这里找到了解决方法:
引用
来自:http://topic.csdn.net/t/20060704/17/4860219.html
在源   SQL   Server   上运行以下脚本。此脚本可在   master   数据库中创建名为   sp_hexadecimal   和   sp_help_revlogin   的两个存储过程。请在完成过程的创建之后继续执行第   2   步。  
    
  注意:下面的过程取决于   SQL   Server   系统表。这些表的结构在   SQL   Server   的不同版本之间可能会有变化,请不要直接从系统表中选择。    
  -----   Begin   Script,   Create   sp_help_revlogin   procedure   -----  
    
  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   -   (@firstint*16)  
      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,   name,   xstatus,   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,@SID_string   OUT  
                  SET   @tmpstr   =   'EXEC   master..sp_addlogin   '''   +   @name  
                      +   ''',   NULL,   @sid   =   '   +   @SID_string   +   ',   @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,   @name,   @xstatus,   @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  
    
      
    
    
  SP_DEFAULTDB   'cyiyun','DB_WAYUP'  


第1步后,在源服务器上运行sp_help_revlogin后,会产生创建用户数据的SQL,例如:
引用

/*   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',   @pwd,   @sid   =   0x1738BB6AD0CD24498F67FB5589E8EDCB,   @encryptopt   =   'skip_encryption'

......


把这段直接在新服务器上运行,或者找到相应的用户名创建,就可以解决这个问题了!
yangtze Homepage
2011/01/13 23:28
[emot]zan[/emot]学习了
减肥药排行榜 Homepage
2010/08/20 14:40
哦!是这样的 啊!!谢谢了
淘宝网 Homepage
2010/07/25 00:52
呵呵。。

学习了。。
分页: 1/1 第一页 1 最后页
发表评论
表情
emotemotemotemotemot
打开HTML
打开UBB
打开表情
隐藏
昵称   密码   游客无需密码
网址   电邮   [注册]
               

验证码 不区分大小写