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

时间:2010-07-16 13:53:45

标签: sql-server-2005 scripting membership role

我有一个包含大量用户的数据库。这些用户属于DB中不同的内置角色(例如db_ddladmin)。

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

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

4 个答案:

答案 0 :(得分:21)

系统视图中提供了有关数据库用户及其分配角色的信息 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'

使用与A:

中相同的角色配置B中的新用户
  • 在数据库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登录。如果您有用户定义的角色, 你需要先重新创建它们。 (分配给他们的角色和权限是非常开放式的,我不希望遇到需要这样做的情况!)

答案 1 :(得分:0)

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

答案 2 :(得分:0)

对于数据库用户角色

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

答案 3 :(得分:0)

调整原始答案以使用新的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'

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