错误21002:[SQL-DMO]用户"xxx"已经存在

MSSQL2000迁移数据库后,新建相同用户名的时候出现错误提示:“错误21002:[SQL-DMO]用户"xxx"已经存在”
产生原因:
这就是我们通常所说的“
孤立用户
”,所谓孤立帐户,就是某个数据库的帐户只有用户名而没有登录名,这样的用户在用户库的sysusers系统表中存在,而在master数据库的syslogins中却没有对应的记录。

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

使登录用户和数据库的孤立用户对应起来
       其实我们建立了同样名称的数据库登录用户后,数据库中的表我们照样不能使用时因为sid的不同,就是系统登录表和数据库用户表中的用户名相同,单是sid字段,数据库中的还是以前旧系统的sid值,所以我们就要把它对应成我们新建的,数据库靠sid来识别用户。
       这里可以使用存储过程sp_change_users_login。它有三种动作,分别是report,update_one和auto_fix。
       运行sp_change_users_login 'report',系统会列出当前数据库的孤立用户数。
       我们只需要选择当前数据库为testdb,然后运行
       sp_change_users_login 'update_one','test','test'
       系统就会提示修复了一个孤立用户。
       如果没有建立test的登录用户,还可以用
sp_change_users_login 'Auto_Fix', 'test', NULL, 'testpassword'
来创建一个登录用户名为test,密码为testpassword的用户与之对应。
      
好了,到这里通常情况下,数据库对象得到访问问题已经解决了。如果有多个数据库中有同一个用户的数据表,只需要选择不同的数据库,执行update_one的那个就行了。

转自:http://www.cnblogs.com/jamin/archive/2008/06/17/1223614.html

===================================================================================

1. 查看某个数据库的孤立用户:
    USE 库名
    EXEC sp_change_users_login 'Report'

2. 自动修复某个孤立用户:
    USE 库名
    EXEC sp_change_users_login 'Auto_Fix', '孤立用户名', NULL, '密码'

      --密码指用户对应的登录不存在时, 系统自动建立登录, 为登录分配的密码
    报错:
       服务器: 消息 8144,级别 16,状态 2,过程 sp_change_users_login,行 0
      为过程或函数 sp_change_users_login 指定的参数太多。
      --报错时候, 可删除“,'密码'”部分(版本或者补丁问题)
3.表已经恢复完毕,有孤立用户 user1, 在登录中已建立登录用户 user2

sp_change_users_login @Action = 'Update_One'
, @UserNamePattern = 'user1'
, @LoginName = 'user2'

可将 user1 与 user2(以user2用户名登录) 关联

翻译:

**************************************************************************************************
sp_change_users_login  
      新增信息   -   SQL   Server   2000   SP3。  
   
将数据库中现有的用户映射到   Microsoft®   SQL   Server™   登录。  
   
语法  
sp_change_users_login   [   @Action   =   ]   'action'    
          [   ,   [   @UserNamePattern   =   ]   'user'   ]    
          [   ,   [   @LoginName   =   ]   'login'   ]  
          [   ,   [   @Password   =   ]   'password'   ]  
   
参数  
[   @Action   =   ]   'action'  
   
描述此过程要执行的操作。action   的数据类型为   varchar(10),可以是下面的某个值。  
   
值   描述    
Auto_Fix   将当前数据库   sysusers   表中的用户条目链接到   sysxlogins   中同名的登录。应检查   Auto_Fix   语句的结果,确认实际中的链接正确。在对安全性较为敏感的情况下,要避免使用   Auto_Fix。    
使用   Auto_Fix   时,必须指定   user   和   password;login   必须为   NULL。user   必须是当前数据库中的有效用户。  
     
Report   列出当前数据库中未链接到任何登录的用户以及相应的安全标识符   (SID)。    
user、login   和   password   必须为   NULL   或不指定。  
     
Update_One   将当前数据库中指定的   user   链接到   login。login   必须已存在。必须指定   user   和   login。password   必须为   NULL   或不指定。    
   
   
[@UserNamePattern   =]   'user'  
   
是当前数据库中的   SQL   Server   用户的名称。user   的数据类型为   sysname,默认值为   NULL。    
   
[@LoginName   =]   'login'  
   
SQL   Server   登录的名称。login   的数据类型为   sysname,默认值为   NULL。    
   
[@Password   =]   'password'  
   
是指派给   Auto_Fix   创建的新   SQL   Server   登录的密码。如果已存在匹配的登录,将映射用户和登录并忽略   password。如果不存在匹配的登录,sp_change_users_login   将新建一个新的   SQL   Server   登录并将   password   指派为该新登录的密码。password   是   sysname,默认值为   NULL。  
   
返回代码值  
0(成功)或   1(失败)  
   
结果集  
列名   数据类型   描述    
UserName   sysname   登录名。    
UserSID   varbinary(85)   登录安全标识符。    
   
   
注释  
使用此过程将当前数据库中用户的安全帐户链接到登录。如果用户登录已更改,则使用   sp_change_users_login   将用户链接到新的登录,而不会丢失用户的权限。  
   
sp_change_users_login   只能用于   SQL   Server   登录;它不能用于   Windows   登录。  
   
login   不能为   sa,而   user   不能为   dbo、guest   或   INFORMATION_SCHEMA   用户。  
   
不能在用户定义的事务中执行   sp_change_users_login。  
   
权限  
任何   public   角色的成员均可执行带有   Report   选项的   sp_change_users_login。只有   sysadmin   固定服务器角色的成员才能指定   Auto_Fix   选项。只有   sysadmin   或   db_owner   角色的成员才能指定   Update_One   选项。  
   
示例  
A.   显示登录映射的当前用户的报告  
下面的示例生成当前数据库中的用户及其安全标识符的报告。  
   
EXEC   sp_change_users_login   'Report'  
   
B.   更改用户的登录  
下面的示例更改   pubs   数据库中的用户   Mary   与现有登录之间的链接,链接到新的登录   NewMary   上(使用   sp_addlogin   添加)。  
   
--Add   the   new   login.  
USE   master  
go  
EXEC   sp_addlogin   'NewMary'  
go  
   
--Change   the   user   account   to   link   with   the   'NewMary'   login.  
USE   pubs  
go  
EXEC   sp_change_users_login   'Update_One',   'Mary',   'NewMary'  
   
C.   自动将用户映射到登录(必要时新建一个新登录)  
下例显示如何使用   Auto_Fix   选项将现有的用户映射到同名的登录,或者如果不存在登录   Mary,则创建密码为   B3r12-36   的   SQL   Server   登录   Mary。  
   
USE   pubs  
go  
EXEC   sp_change_users_login   'Auto_Fix',   'Mary',   NULL,   'B3r12-36'  
go 

你可能感兴趣的:(数据库)