我正在将生产数据库的备份恢复到新服务器 。 新服务器还托pipe使用数据库的应用程序。 因此,我想使用相同的用户/传递组合来连接到数据库。 用户也包括在数据库备份,所以我认为应该工作。 但是,用户在新服务器上不存在(数据库)用户 。 所以我创build了一个新的服务器用户,并试图将这个凭证映射到新恢复的数据库。 但是,这是因为user already exists于数据库中。
是否有可能(如果是这样,请告诉我如何)将用户从数据库(独立于服务器)移动/复制到(数据库)服务器login名单?
在SQL Server 2008中,恢复的数据库和服务器login的数据库用户可能不同步,因为内部ID不匹配。 要解决这个问题,
EXEC sp_change_users_login @Action =''Update_One'',@ UserNamePattern ='databaseusername',@LoginName ='logonname';
针对您还原的数据库和每个用户/login名。
在SQL-Server 2012中,有一个独立于服务器login的独立于数据库用户的新选项。
我知道我迟到了,但可能会帮助别人。
login位于服务器级别。 用户处于数据库级别。 有一个ID值(称为SID)将两者连接在一起。 在新服务器上创buildSQLlogin时,SQL会select一个新的SID值。 SIDselectalgorithm的本质是,在两台不同的服务器上你不会得到相同的值。 从旧服务器恢复数据库时,数据库中的SID值与服务器上的SID值不匹配。
此时,您想使用sp_change_users_login。
但是,在您达到这一点之前,您可以为自己节省很多烦恼,特别是如果您有从旧服务器迁移到新服务器的login日志。 看看sp_help_revlogin。 这是Microsoft支持的一个过程。 proc和文档位于这里和这里 。 (对于不同版本的SQL Server,有不同版本的过程,还有一个称为“sp_hexadecimal”的助手函数)。基本上,您需要在旧服务器上创build这些过程,然后运行它们。 知识库文章有详细信息。
sp_help_revlogin的巨大胜利在于它产生了用户创buildDDL,保留了SQLlogin的ID值和密码。 这样,您可以运行sp_help_revlogin,查看生成的DDL以查找所需的用户,在新服务器上运行该代码,然后恢复数据库。 此时,SID值应该匹配,并且不需要sp_change_users_login。
另一种方式是使用集成(又名“域”或“窗口”)安全。 使用ADlogin时,创buildlogin时,将从域中提取SID值。 当您为该login创build数据库用户时,该SID值将被置于数据库中。 由于SID值只有一个来源,所以不会出现不匹配。 当然,使用集成安全并不总是可能的。