Answers:
问题在于,还原操作从原始服务器实例中恢复了db用户,但是新实例通常不知道这些用户登录名。您会在数据库级别的“安全性”下看到它们,但是它们没有相应的服务器级别登录名。
您需要在还原数据库的实例上使用服务器登录名将数据库用户重新附加。
有几种解决方法:
在新实例上为其创建新的登录名。然后,您必须在新实例上以数据库用户的身份删除他们,并添加他们的新登录名。鉴于可以创建相同的登录名,这似乎很奇怪,但是SID(安全标识符)将有所不同,这就是SQL用于标识用户的身份。对于一两次登录来说,这很容易。
如果要在实例之间维护相同的用户,并保持相同的SID,请使用sp_help_revlogin存储过程。从链接中复制代码,该链接将创建必要的存储过程,并在要从中复制用户的服务器上运行它。它将生成一个SQL脚本,您可以在目标服务器上运行该脚本,以创建携带SID,密码和所有内容的相同用户。如果您有很多数据库用户需要在目标实例上重新连接,或者您不知道源实例上一个或多个SQL登录名的密码,这就是这种方法。
我始终使用'Update_One'操作运行sp_change_users_login命令,以将数据库用户与服务器登录名重新链接:
sp_change_users_login 'Update_One', 'database user', 'server login'
从SQL Server 2012开始,有一个T-SQL命令将现有用户分配给新登录名。创建登录名,但不要尝试进行用户映射(这将失败)。然后执行:
use <existing_database>;
alter user <existing_database_user> with login = <newly_created_login>;
这会将现有登录名映射到新用户。SQL文档在这里:https : //docs.microsoft.com/zh-cn/sql/t-sql/statements/alter-user-transact-sql?view= sql- server-2017
EXEC sp_change_users_login 'Auto_Fix', 'User', NULL, 'password';代替。:)