我的新数据库中存在用户权限问题。我从不同的服务器复制了这个新数据库,旧服务器数据库有一些用户,被授予执行某些程序的权限。在我备份并恢复到新服务器后,所有权限都消失了。我运行sp_helprotect来查找旧服务器的用户和权限。有没有办法编写这些权限和角色的脚本?
我们现在正在运行SQL Server 2012版本。但那个旧的db在SQL Server 2008 r2中。导致问题的原因是什么?
答案 0 :(得分:4)
将数据库还原到新服务器时,即使master
中存在相同的用户,它们也没有相同的系统ID,因此您必须从已还原的数据库中删除用户并添加它们再次恢复到您的数据库。这样,经过身份验证的用户的系统ID就会从master
流向您的数据库,并且所有权利都可以恢复,而无需重新编写所有权限...
例如,当我将数据库恢复到另一台服务器时,我必须为我们使用的每次登录执行以下脚本:
USE [new_db_name]
GO
IF EXISTS (SELECT * FROM sys.database_principals WHERE name = N'login_name')
DROP USER [login_name]
GO
CREATE USER [login_name] FOR LOGIN [login_name]
GO
EXEC sp_addrolemember N'My_StoredProcs', N'login_name'
GO
EXEC sp_addrolemember N'db_datareader', N'login_name'
GO
EXEC sp_addrolemember N'db_datawriter', N'login_name'
GO
您可以看到登录也是某些roles
的成员,因此这些也必须编写脚本。当然,您应该只添加属于每个用户的角色......!您可以通过打开SSMS并向下钻取到DB |下的用户来检查用户分配的角色安全|用户|右键单击用户|属性。
BTW - 如果您的新服务器没有旧数据库中存在的用户,则必须先在master中创建它们,然后再将其重新添加到已还原的数据库中。
答案 1 :(得分:1)
如果您有这样的工具,则可以将大多数数据库比较实用程序配置为迁移用户,角色成员身份和/或权限。我知道作为visual studio数据库版本(以前的Data Dude)的一部分的架构比较工具可以做到这一点,我很确定红门工具也可以做到。
我想我记得有关VS模式比较实用程序在SQL 2012中移动到BIDS等效项(我忘记了新名称)的一些内容。至少值得研究一下,如果你有很多对象需要同步。 / p>