【问题标题】:Copying user roles and permission from one database to another将用户角色和权限从一个数据库复制到另一个数据库
【发布时间】:2012-12-07 15:35:32
【问题描述】:
我的新数据库中的用户权限存在问题。我从不同的服务器复制了这个新数据库,旧的服务器数据库有一些用户,被授予执行一些程序的权限。在我备份并恢复到新服务器后,所有权限都消失了。我运行 sp_helprotect 从我的旧服务器中找出用户和权限。有没有办法编写这些权限和角色的脚本?
我们现在正在运行 SQL Server 2012 版本。但是那个旧数据库在 SQL Server 2008 r2 中。这是导致问题的原因吗?
【问题讨论】:
标签:
sql
sql-server
stored-procedures
sql-server-2008-r2
sql-server-2012
【解决方案1】:
当您将数据库恢复到新服务器时,即使 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 | 下的用户来检查为用户分配了哪些角色。安全 |用户 |右键单击用户 |属性。
编辑
顺便说一句 - 如果您的新服务器没有旧数据库中存在的用户,您必须先在 master 中创建它们,然后再将它们删除并重新添加到恢复的数据库中。
【解决方案2】:
如果您有这样的工具,大多数数据库比较实用程序都可以配置为迁移用户、角色成员资格和/或权限。我知道作为 Visual Studio 数据库版本(以前称为 Data Dude)的一部分的架构比较工具可以做到这一点,我很确定红门工具也可以做到这一点。
我想我记得一些关于 VS 模式比较实用程序在 SQL 2012 中移动到 BIDS 等效项(我忘记了新名称是什么)的一些内容。如果您有很多要同步的对象,至少值得研究一下。