代码之家  ›  专栏  ›  技术社区  ›  Coderer

在SQL Server 2005中,是否有一种简单的方法可以将对象的权限从一个用户/角色“复制”到另一个用户/角色?

  •  2
  • Coderer  · 技术社区  · 16 年前

    我问 another question 关于角色和权限,这主要是为了揭示我的无知。另一个结果是建议人们一般不要在“公共”角色的许可下胡闹。

    好的,好的,但是如果我已经这样做了,并且想重新分配相同的权限给一个自定义/灵活的角色,那么最好的方法是什么?到目前为止,我所做的是运行脚本向导,告诉它在不创建或删除的情况下编写对象权限脚本,然后运行查找替换,这样我最终得到了大量 "GRANT DELETE on [dbo.tablename] TO [newRole]" . 它能完成任务,但我觉得它可能更漂亮/更容易。有什么“最佳实践”建议吗?

    2 回复  |  直到 13 年前
        1
  •  5
  •   gbn    13 年前

    使用内存(我的游戏池没有SQL),您可以使用 sys.database_permissions

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

    编辑,2012年1月。添加了对象\架构\名称。
    您可能需要通过连接到sys.objects来pimp它来支持模式(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;
    
        2
  •  1
  •   Nick Kavadias    16 年前

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

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

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

    NT用户->NT安全组->SQL Server角色->SQL Server角色A,角色B…