我在 Sql Server 2008 中工作。问题是当我恢复数据库时,数据库用户被禁用,我可以将该特定用户与登录用户进行映射。为了进行映射,我必须从数据库中删除用户,然后映射用户。
例如:- 数据库名称:- Clv 数据库用户:- Clv 服务器日志:- Clv 此用户与 Clv 数据库 Clv 用户映射
Then i took full backup of the Clv database. Now i want to change the server of the database so i restore the backup in new server.
In new server i Create Clv login and trying to map it with the Clv database's Clv user but the error is there is already a Clv User so i delete the user of the database and then i map user again so its done on that way but i want to know that is there any other way out for this situation or there is only this wayout.
Now when i restore the database the The Clv database User no longer mapped with the Clv Login. For to doing That i have to remove Clv database user first and the Map with Clv Login.
那么还有其他解决方案吗?
答案1
是的,首先使用以下语句检查恢复的数据库上的孤立用户:
sp_change_users_login @Action='报告'
然后使用这个重新映射孤立用户。您必须用孤立用户和实际的数据库登录名进行替换
sp_change_users_login @Action='update_one',@UserNamePattern='',@LoginName=''
答案2
有一个相关问题在 Stack Overflow 上。abalogh 的回答指出了一个非常有用的Microsoft 支持链接提供有关该问题的信息并提出多种解决方案。
答案3
用户不是通过名称映射到登录名,而是通过称为 sid(安全标识符)的标识符映射到登录名。幸运的是,您可以查看这些登录名并找到不匹配的登录名。sys.database_principals 视图有一个名为 sid 的列,它映射到 sys.server_principals 中名为 sid 的列。在它们之间进行左连接以查找数据库中未映射到登录名的用户。由于您正在使用 SQL 2008,因此更改用户所关联的登录名的首选方法是“alter user [foo] with login = [bar]”
另一种方法是在目标服务器上创建具有正确 sid 的登录名,这样当您恢复数据库时,sid 就会匹配。语法是“create login [bar] with sid = 0xyour_sid_here...”。希望这对您有所帮助。