我有一个数据库,里面有很多用户。这些用户属于数据库中不同的内置角色(例如 db_ddladmin)。
我想生成一个脚本,该脚本创建具有相同角色分配的相同用户以在不同数据库中使用。SQL Management Studio 似乎只为用户定义的角色生成 sp_addrolemember 调用,而不是内置角色。有没有办法让它编写所有角色的脚本?
也许还有其他更好的工具可以从现有数据库生成数据库脚本(最好,但不一定是免费的)?
我有一个数据库,里面有很多用户。这些用户属于数据库中不同的内置角色(例如 db_ddladmin)。
我想生成一个脚本,该脚本创建具有相同角色分配的相同用户以在不同数据库中使用。SQL Management Studio 似乎只为用户定义的角色生成 sp_addrolemember 调用,而不是内置角色。有没有办法让它编写所有角色的脚本?
也许还有其他更好的工具可以从现有数据库生成数据库脚本(最好,但不一定是免费的)?
系统视图 sys.database_principals 和 sys.database_role_members 中提供了有关数据库用户和分配给他们的角色的信息。使用以下查询查看此数据:
select * from sys.database_principals
select * from sys.database_role_members
我假设您在数据库 A 中配置了数据库用户和角色,并且您希望将它们复制到数据库 B。要在目标数据库中创建用户:
.
SELECT 'CREATE USER [' + name + '] for login [' + name + ']'
from sys.database_principals
where Type = 'U'
and name <> 'dbo'
要将 B 中的新用户配置为具有与 A 中相同的角色:
.
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 登录名。如果您有用户定义的角色,则需要先重新创建它们。(角色和分配给他们的权限是非常开放的,我不想处于需要这样做的情况!)
这是来自 Idera 的一个选项:http ://www.idera.com/Products/Free-Tools/SQL-permissions/ 它会生成登录名和权限,并可以帮助您完成您正在尝试的事情。
对于数据库用户角色
SELECT 'CREATE ROLE [' + name + ']'
FROM sys.database_principals
where type='R' and is_fixed_role = 0 and name != 'public'
调整原始答案以使用新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'
这是特定于数据库的 - 在要为其提取角色的数据库中运行它