zoukankan      html  css  js  c++  java
  • [轉]使用sp_change_users_login修复产生的孤立账户& 还原中的孤立用户

    轉自:http://www.cnblogs.com/hyl8218/archive/2010/02/03/1662075.html

    我们通常所说的“孤立用户”,就是孤立帐户,是指某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录。

    孤立帐户的产生一般是一下两种:
    1.将备份的数据库在其它机器上还原;
    2.重装系统或SQL SERVER之后只还原了用户库

    解决方法:
    解决方法是使用sp_change_users_login来修复。

    sp_change_users_login的用法有三种

    修复方法:
    步骤1:
    exec sp_change_users_login 'REPORT'
    列出当前数据库的孤立用户

    步骤2:
    exec sp_change_users_login 'AUTO_FIX','用户名'
    可以自动将用户名所对应的同名登录添加到syslogins中

    步骤3:
    exec sp_change_users_login 'Update_ONE','用户名','登录名'
    将用户名映射为指定的登录名。

    以下是邹健大哥書中的處理方法

    --创建一个测试的数据库
    CREATE DATABASE db
    GO
    
    --创建两个登录
    EXEC sp_addlogin 'aa'
    EXEC sp_addlogin 'bb'
    
    --设置登录的默认数据库为测试数据库 db
    EXEC sp_defaultdb 'aa','db'
    EXEC sp_defaultdb 'bb','db'
    GO
    
    --授予登录访问数据库的权限(将登录设置为数据库的用户)
    USE db
    EXEC sp_grantdbaccess 'aa'
    EXEC sp_grantdbaccess 'bb'
    
    --创建一个属于用户bb的表
    CREATE TABLE bb.tb(id int)
    GO
    
    --至此,测试环境已经创建好了,使用用户aa或者bb从查询分析器登录,验证用户的可用性
    
    --用户验证完成后,备份并删除测试数据库,演示孤立用户的产生过程
    USE master
    BACKUP DATABASE db TO DISK='c:\db.bak' WITH FORMAT
    DROP DATABASE db
    GO
    
    --删除登录,用以模拟目标服务器没有事先创建登录时的情况
    EXEC sp_droplogin 'aa'
    EXEC sp_droplogin 'bb'
    GO
    
    --还原测试数据库
    RESTORE DATABASE db FROM DISK='c:\DB.bak'
    GO
    
    --查看还原后的测试数据库的用户
    USE db
    EXEC sp_helpuser
    /*--结果
    UserName GroupName   LoginName DefDBName UserID SID
    -------- --------- -------- -------- ----- --------------------------------------------
    aa   public    NULL   NULL   5  0x71BA40BA3C89FA43A5DFD74620E81FDA
    bb   public    NULL   NULL   6  0xDE41BBF527C4F545AFFA0EBAE864DE40
    dbo  db_owner  NULL   NULL   1  0x010500000000000515000000BE604AE3EA4BA8F3E9CE046BF4010000
    --*/
    
    --可以看到用户aa,bb在还原后的数据库中确实存在,但使用aa或者bb登录时,会提示"用户'aa'登录失败"
    GO
    
    --下面重新建立登录aa,bb
    EXEC sp_addlogin 'aa'
    EXEC sp_addlogin 'bb'
    
    --这次可以使用aa,bb登录,但登录后无法访问测试数据库db
    GO
    
    --将登录设置为测试数据库的用户
    USE db
    EXEC sp_grantdbaccess 'aa'
    EXEC sp_grantdbaccess 'bb'
    /*--将收到错误信息
    服务器: 消息 15023,级别 16,状态 1,过程 sp_grantdbaccess,行 147
    当前数据库中已存在用户或角色 'aa'。
    服务器: 消息 15023,级别 16,状态 1,过程 sp_grantdbaccess,行 147
    当前数据库中已存在用户或角色 'bb'。
    --*/
    GO
    
    --尝试删除测试数据库中的用户
    EXEC sp_revokedbaccess 'aa'
    /* 用户aa可以正常删除,因为用户aa在测试数据库中没有对象 */
    EXEC sp_revokedbaccess 'bb'
    /*--将收到错误信息
    服务器: 消息 15183,级别 16,状态 1,过程 sp_MScheck_uid_owns_anything,行 17
    该用户拥有数据库中的对象,无法除去该用户。
    name        type
    ----------- -------
    tb          U 
    --*/
    
    --再次授予登录aa访问测试数据库的权限
    EXEC sp_grantdbaccess 'aa'
    
    --这次可以顺利授权,并且用aa登录也可以正常访问测试数据库.
    
    
    /*=================================================================*/
    --解决孤立用户bb
    
    --1. 报告孤立用户
    USE db
    EXEC sp_change_users_login 'Report'
    GO
    
    
    --2. 处理孤立用户
    USE db
    EXEC sp_change_users_login 'Auto_Fix','bb',null,'bb'



    MS 參考資料
    http://support.microsoft.com/kb/305711/zh-cn

  • 相关阅读:
    Otter详解
    为什么要使用Netty
    haproxy实现mysql集群负载均衡
    Mysql主从复制
    java编程思想读书笔记三(HashMap详解)
    代码界的石器时代
    补码的产生与应用
    java编程思想读书笔记二(对象的创建)
    java编程思想读书笔记一(面向对象)
    Apache VFS
  • 原文地址:https://www.cnblogs.com/Athrun/p/1793060.html
Copyright © 2011-2022 走看看