我们在名为“SQL01”的第一个SQL Server实例上有一个名为“foo”的数据库,每天晚上通过Snap Manager for SQL Server快照进行备份,然后将其克隆并复原到另一个名为“SQL02”的服务器实例。 在数据库foo中有一个名为'someuser'的sql用户,它具有datareader和存储过程权限。
执行还原操作后,我无法使用someuser用户访问SQL02上的foo数据库。 我可以看到权限似乎为用户正确设置,但无法访问数据库。 错误是“服务器主体”someuser“无法在当前安全上下文中访问数据库”foo“。
如果我从数据库中删除用户,然后再次添加它工作正常。 有任何想法吗?
sp_change_users_login是旧的做事方式,因为您正在使用SQL Server 2005,请尝试使用ALTER USER语法。
http://sqlblog.com/blogs/greg_low/archive/2009/02/02/much-ado-about-logins-and-sids.aspx
检出sp_change_users_login执行sp_change_users_login'report',如果有结果,请使用sp_change_users_login'autofis','someuser'
您可能会发现需要将用户从已恢复的数据库中删除,然后在服务器安全下打开该用户,并将其权限再次设置到该数据库中
服务器login名存储在主数据库中,不会随应用程序数据库一起移动。 您可以在服务器级别创buildlogin名,然后使用Sankarbuild议的sp_change_users_login'auto_fix','loginname'。 要移动一组更大的login名,请检查以下链接: 如何在SQL Server实例之间传输login名和密码
为避免此问题,请将您的用户(正在进行备份的用户)添加为Backup数据库的用户,并且您的用户应该在新实例中拥有(login)权限。