2

我问了另一个关于角色和权限的问题,这主要是为了暴露我的无知。其他结果之一是建议人们通常应该远离“公共”角色的权限。

好的,很好,但是如果我已经这样做了并且想将相同的权限重新分配给自定义/“灵活”角色,那么最好的方法是什么?到目前为止,我所做的是运行脚本向导,并告诉它在没有 CREATE 或 DROP 的情况下编写对象权限脚本,然后运行 ​​find-replace 以便我得到很多"GRANT DELETE on [dbo.tablename] TO [newRole]". 它完成了工作,但我觉得它可能更漂亮/更容易。任何“最佳实践”建议?

4

2 回答 2

6

从内存中工作(我的游戏'pooter 上没有 SQL),您可以使用sys.database_permissions

运行此命令并将结果粘贴到新查询中。

编辑,2012 年 1 月。添加了 OBJECT_SCHEMA_NAME。
您可能需要通过加入 sys.objects 来支持模式 (dbo.)

SET NOCOUNT ON;
DECLARE @NewRole varchar(100), @SourceRole varchar(100);

-- Change as needed
SELECT @SourceRole = 'Giver', @NewRole = 'Taker';

SELECT
    state_desc + ' ' + 
          permission_name + ' ON ' + 
          OBJECT_SCHEMA_NAME(major_id) + '.' + OBJECT_NAME(major_id) +
          ' TO ' + @NewRole
FROM
    sys.database_permissions
WHERE
    grantee_principal_id = DATABASE_PRINCIPAL_ID(@SourceRole) 
    AND
    -- 0 = DB,  1 = object/column, 3 = schema. 1 is normally enough
    class <= 3;
于 2008-12-17T19:44:07.580 回答
1

拥有一个角色的想法是您只需要设置一次权限。然后,您可以将用户或用户组分配给该角色。

也可以嵌套角色,以便一个角色可以包含其他角色。

不确定它是否是最佳实践,但如果您拥有一组复杂的权限,并且需要访问多个应用程序的用户组,您可以这样做:

NT 用户 -> NT 安全组 -> SQL Server 角色 -> SQL Server 角色 A、角色 B ...

于 2008-12-16T21:01:01.373 回答