在 SQL Server 2005 中为数据库角色成员生成脚本

Posted

技术标签:

【中文标题】在 SQL Server 2005 中为数据库角色成员生成脚本【英文标题】:Generating scripts for database role membership in SQL Server 2005 【发布时间】:2011-03-16 23:36:30 【问题描述】:

我有一个数据库,里面有很多用户。这些用户属于数据库中不同的内置角色(例如 db_ddladmin)。

我想生成一个脚本来创建具有相同角色分配的相同用户,以便在不同的数据库中使用。 SQL Management Studio 似乎只为用户定义的角色生成 sp_addrolemember 调用,而不是内置角色。有没有办法让它为所有角色编写脚本?

也许还有其他更好的工具可以从现有数据库生成数据库脚本(最好,但不一定是免费的)?

【问题讨论】:

这应该可以通过使用系统表/视图来编写脚本。如果没有其他人发帖,我稍后会处理一些事情。 【参考方案1】:

调整原始答案以使用新的ALTER ROLE 语法:

SELECT 'ALTER ROLE  [' + roles.name + '] ADD MEMBER [' + users.name + '];'
from sys.database_principals users
inner join sys.database_role_members link
on link.member_principal_id = users.principal_id
inner join sys.database_principals roles
on roles.principal_id = link.role_principal_id
where users.name = 'MyUser'

这是特定于数据库的 - 在要为其提取角色的数据库中运行它

【讨论】:

【参考方案2】:

有关数据库用户及其分配的角色的信息在系统视图中可用 sys.database_principals 和 sys.database_role_members。使用以下查询查看这些数据:

select * from sys.database_principals
select * from sys.database_role_members

我假设您在数据库 A 中配置了数据库用户和角色,并且您希望将它们复制到数据库 B。在目标数据库中创建用户:

在数据库 A 中运行以下查询 在数据库 B 中剪切、粘贴、查看并运行生成的脚本

.

SELECT 'CREATE USER [' + name + '] for login [' + name + ']'
 from sys.database_principals
 where Type = 'U'
  and name <> 'dbo'

为 B 中的新用户配置与 A 中相同的角色:

在数据库 A 中运行以下查询 在数据库 B 中剪切、粘贴、查看并运行生成的脚本

.

SELECT 'EXECUTE sp_addrolemember ''' + roles.name + ''', ''' + users.name + ''''
 from sys.database_principals users
  inner join sys.database_role_members link
   on link.member_principal_id = users.principal_id
  inner join sys.database_principals roles
   on roles.principal_id = link.role_principal_id

始终查看这些脚本。可能会有例外或特殊情况发生,您只是不想破坏安全性。

如果新数据库位于不同的 SQL Server 实例上,您必须先创建 SQL 登录。如果您有用户定义的角色, 您需要先重新创建它们。 (角色和分配给他们的权限是非常开放式的,我不想处于需要这样做的情况!)

【讨论】:

正是我想要的! :) 完美,创建脚本的脚本。我曾尝试使用 Generate Script 编写登录脚本...但遇到权限问题,现在没有问题,谢谢。 请注意,如果您的数据库有区分大小写的排序规则,则应该是 sp_addrolemember。我编辑了上面的答案以反映这一点。【参考方案3】:

对于数据库用户角色

SELECT 'CREATE ROLE [' + name + ']' 
  FROM sys.database_principals 
  where type='R' and is_fixed_role = 0 and name != 'public'

【讨论】:

写答案时,尝试格式化它们。 *** 使用降价。【参考方案4】:

这是 Idera 的一个选项:http://www.idera.com/Products/Free-Tools/SQL-permissions/ 它会生成登录名和权限,并可以帮助您完成您正在尝试的事情。

【讨论】:

以上是关于在 SQL Server 2005 中为数据库角色成员生成脚本的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server 2005的服务器角色(public)的问题

使用 SQL Server 2005 通过 LDAP 访问 Active Directory 角色成员资格

SQL Server 2005 - 用户权限

SQLserver 2005 数据库基础问题,我是新手,求答案,能详细就详细点,谢谢!

ROW_NUMBER SQL Server 2005的LIMIT功能实现(ROW_NUMBER()排序函数)

简化 SQL Server 的登录名/所有者/架构/角色/主体等