我计划在两台服务器之间迁移一些SQL Server 2008 R2数据库。
该提案将遵循本文中的方法3:http://support.microsoft.com/kb/918992在迁移数据库后,在之间传输登录信息。
这对我来说看起来不错,但有一个问题是目标服务器上是否已存在这些登录。如果是这种情况,还有什么需要做的,如果是这样的话呢?
[我的理解在这里有点朦胧 - 由于他们引用的登录在新服务器上有不同的SID,因此恢复数据库中的用户是否仍可能成为孤儿?]
答案 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>