我们在附加一个数据库到一个新的数据库服务器中的时候,数据库中用户的SID和服务器中用户的SID肯定是不一致的,即使他们的用户名相同,我们也不可能从外部用该用户名进行登录来访问新附加的数据库,这时候我们就说这个数据库中的用户是一个孤立用户,因为该用户没有在该服务器中进行登记。这里就存在着一个映射的关系,我们必须通过一些命令来建立这种关系。

  用来映射一个孤立用户的命令

 


sp_change_users_login  
   @Action 
   = 
   ' 
   update_one 
   ' 
   , 
 
   @UserNamePattern 
   = 
   ' 
   TestUser1 
   ' 
   , 
 
   @LoginName 
   = 
   ' 
   TestUser1 
   ' 
    
 
   GO


 

   或者如果你确定SQL Server 登录名和映射的数据库孤立用户名一样,那么接着你可以使用更短的命令,比如以下TestUser2的例子。



EXEC 
    sp_change_users_login  
   ' 
   Auto_Fix 
   ' 
   ,  
   ' 
   TestUser2 
   ' 
    
 
   GO


 

  这两种命令都可以把用户映射到登录名,并且它们将不再是孤立的。

  如果一个登录名不存在,你必须在做映射之前先创建这个登录名。创建登录名的一种便捷方式是使用以下将会创建登录名接着把登录名映射到用户的命令。

  用来把一个孤立用户映射到一个还未出现但是将要创建的登录名的命令

 


EXEC 
    sp_change_users_login  
   ' 
   Auto_Fix 
   ' 
   ,  
   ' 
   TestUser3 
   ' 
   ,  
   null 
   , 
   ' 
   pwd 
   ' 
    
 
   GO

总结应用的T-SQL


  在以上过程中,使用了存储过程sp_change_users_login。变量[ @Action ]指定了这个存储过程的准确用法。它接受像varchar(10)这样的参数并且有以下的一种值:

  l 如果参数是Auto_Fix,那么数据库用户从相同名称的SQL Server 登录名映射。如果这个登录名没有显示,它也可能会产生登录名。

  l 如果参数是Report,它列出孤立用户和它们的安全标识符(SID)。

  l 如果参数是Update_One,它从指定的数据库链接到现有的SQL Server 登录名。

  一些注意事项

  l sp_change_users_login要求是db_owner固定数据库角色的组成成员,只有成为db_owner固定数据库角色的组成成员才能指定Auto_Fix选项。

  l 当映射孤立用户时,主从数据库中的SID将分配给孤立用户,所以每次一个数据库备附加或者还原时,SID在SQL Server 登录名和数据库用户之间都存在差异。

  l 如果你有映射到一个数据库用户的不同的Server 登录名,那么不要使用Auto_Fix命令来链接。

  l 如果相应的SQL Server 登录名被删除,那么一个用户也可能成为孤立的。

  l 虽然这是很显而易见的,但是还是有必要提出来,在重新链接之后,SQL Server 登录名的密码可以由数据库用户所使用。