我正在将生产数据库的备份恢复到新服务器。新服务器还托管使用数据库的应用程序。因此,我想使用相同的用户/密码组合来连接到数据库。用户也包含在数据库备份中,所以我认为这应该可行。但是,该用户在新服务器上并不作为(数据库)用户存在。所以我创建了一个新的服务器用户,并试图将这个凭证映射到新恢复的数据库。但是,这失败了,因为user already exists
在数据库中。
是否有可能(如果可以,请告诉我如何)将用户从数据库(独立于服务器)移动/复制到(数据库)服务器登录列表?
我正在将生产数据库的备份恢复到新服务器。新服务器还托管使用数据库的应用程序。因此,我想使用相同的用户/密码组合来连接到数据库。用户也包含在数据库备份中,所以我认为这应该可行。但是,该用户在新服务器上并不作为(数据库)用户存在。所以我创建了一个新的服务器用户,并试图将这个凭证映射到新恢复的数据库。但是,这失败了,因为user already exists
在数据库中。
是否有可能(如果可以,请告诉我如何)将用户从数据库(独立于服务器)移动/复制到(数据库)服务器登录列表?
在 SQL-Server 2008 中,还原数据库的数据库用户和服务器登录名可能不同步,因为内部 ID 不匹配。要修复此运行:
EXEC sp_change_users_login @Action=''Update_One'', @UserNamePattern='databaseusername', @LoginName = 'logonname';
针对您恢复的数据库和每个用户/登录。
在 SQL-Server 2012 中,有一个新选项可以独立于服务器登录使用数据库用户。
我知道我迟到了,但这可能会对其他人有所帮助。
登录在服务器级别。用户处于数据库级别。有一个 ID 值(称为 SID)将两者连接在一起。当您在新服务器上创建 SQL 登录时,SQL 会选择一个新的 SID 值。SID 选择算法的本质是您不会在两个不同的服务器上获得相同的值。当您从旧服务器还原数据库时,数据库中的 SID 值与服务器上的 SID 值不匹配。
此时,您想使用 sp_change_users_login。
但是,在你到达那个点之前,你可以避免很多麻烦,特别是如果你有一个登录日志要从旧服务器迁移到新服务器。查看 sp_help_revlogin。这是 Microsoft 支持的 proc。过程和文档位于此处和此处。(不同版本的 SQL Server 有不同版本的过程。还有一个名为“sp_hexadecimal”的辅助函数。)基本上,您需要在旧服务器上创建这些过程,然后运行它们。知识库文章有详细信息。
sp_help_revlogin 的一大优势在于它生成了用户创建 DDL,该 DDL 保留了 SQL 登录的 ID 值和密码。这样,您只需运行 sp_help_revlogin,查看生成的 DDL 以找到您需要的用户,在新服务器上运行该代码,然后恢复数据库。那时,SID 值应该匹配,您将不需要 sp_change_users_login。
另一种解决方法是使用集成(也称为“域”或“Windows”)安全性。使用 AD 登录时,SID 值是在您创建登录时从域中提取的。当您为该登录创建数据库用户时,该 SID 值将被放入数据库中。由于 SID 值只有一个来源,因此不会发生不匹配。当然,使用集成安全并不总是可行的。