如何将SQL Server登录从一台服务器传输到另一台服务器?

时间:2013-01-29 10:17:24

标签: sql-server login sql-server-2008-r2 database-migration

我计划在两台服务器之间迁移一些SQL Server 2008 R2数据库。

该提案将遵循本文中的方法3:http://support.microsoft.com/kb/918992在迁移数据库后,在之间传输登录信息。

这对我来说看起来不错,但有一个问题是目标服务器上是否已存在这些登录。如果是这种情况,还有什么需要做的,如果是这样的话呢?

[我的理解在这里有点朦胧 - 由于他们引用的登录在新服务器上有不同的SID,因此恢复数据库中的用户是否仍可能成为孤儿?]

1 个答案:

答案 0 :(得分:1)

该脚本生成登录脚本而不是直接执行语句,因此您可以查看它们,并为目标上尚不存在的用户运行脚本。

该脚本将生成新的SID,具体取决于新登录是否需要新登录 - 这取决于登录类型。

关于主题的MSDN

  

SID的来源取决于如何创建登录。如果   登录是从Windows用户或组创建的,它是Windows   源主体的SID; Windows SID在内部是唯一的   域。如果SQL Server登录是从证书或   非对称密钥,它被分配一个从SHA-1哈希派生的SID   公钥。如果登录是作为旧式SQL Server创建的   登录需要密码,服务器将生成一个SID。

除非您将sys.server_principals表格用于特殊内容,否则我不认为您需要担心这一点。


根据以下评论,Steve希望通过脚本创建登录,并在新服务器上分离并重新附加数据库。令人担忧的是,这些登录现在将成为孤立状态 - 即附加到原始服务器上的登录名,其名称与新服务器上的登录名相同,但具有不同的SID。

是的,这将是一个问题。要对此进行排序,您需要访问this MSDN article。总结一下:

要检测孤立用户,请执行以下Transact-SQL语句:

USE <database_name>;
GO; 
sp_change_users_login @Action='Report';
GO;

输出列出当前数据库中未链接到任何SQL Server登录名的用户和相应的安全标识符(SID)。有关更多信息,请参阅sp_change_users_login(Transact-SQL)。

要解决孤立用户,请使用以下过程:

以下命令重新链接由指定的数据库用户指定的服务器登录帐户。

USE <database_name>;
GO
sp_change_users_login @Action='update_one', @UserNamePattern='<database_user>', 
   @LoginName='<login_name>';
GO

史蒂夫指出,sp_change_users_login已弃用,首选替代方法是使用ALTER USER

ALTER USER <database_user>
WITH LOGIN <login_name>

MSDN link