0

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

建议按照本文中的方法 3:http: //support.microsoft.com/kb/918992在迁移数据库传输登录信息。

这对我来说看起来很正常,但一个问题是目标服务器上是否已经存在任何这些登录名。如果是这种情况,是否需要做任何额外的事情,如果是这样,该怎么办?

[我的理解有点模糊 - 恢复数据库中的用户是否可能仍然是孤立的,因为他们引用的登录在新服务器上具有不同的 SID?]

4

1 回答 1

1

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

该脚本将根据新登录名是否需要新的登录名生成新的 SID——这取决于登录名的类型。

来自MSDN关于这个主题:

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

我认为除非您将sys.server_principals桌子用于特殊用途,否则您无需担心这一点。


从下面的评论中,Steve 想通过脚本创建登录,并在新服务器上分离和重新附加数据库。令人担忧的是这些登录现在将成为孤立的——即附加到原始服务器上的登录,其名称与新服务器上的登录相同,但 SID 不同。

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

要检测孤立用户,请执行以下 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 链接

于 2013-01-29T10:25:17.573 回答