【问题标题】:How can I view all grants for an SQL Database?如何查看 SQL 数据库的所有授权?
【发布时间】:2009-01-30 21:28:01
【问题描述】:

我正在使用 SQL Server 2005,我想了解所有表在特定数据库上的所有授权。它还有助于找出已为特定用户授予删除权限的所有表。

注意:这可能类似于this question,但我无法使所选答案的解决方案起作用(如果有人可以提供一个更好的示例来说明如何使用它,那也会有所帮助)

【问题讨论】:

    标签: sql sql-server-2005 permissions


    【解决方案1】:

    给定的解决方案不包括对架构或数据库本身授予权限的位置,它们也对表授予权限。这也会给你这些情况。您可以对 permission_name 使用 WHERE 子句来限制为 DELETE。

    SELECT 
        class_desc 
      , CASE WHEN class = 0 THEN DB_NAME()
             WHEN class = 1 THEN OBJECT_NAME(major_id)
             WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable]
      , USER_NAME(grantee_principal_id) [User]
      , permission_name
      , state_desc
    FROM sys.database_permissions
    

    此外,还需要检查 db_datawriter 的成员资格,因为它提供隐式 INSERT、UPDATE 和 DELETE 权限,这意味着您不会看到它出现在权限 DMV 或其派生词中。

    【讨论】:

      【解决方案2】:

      我喜欢 K. Brian Kelly 的回答,但我想要更多信息(如架构)以及生成相应的 GRANT 和 REVOKE 语句,以便我可以将它们应用于不同的环境(例如 dev/test/prod) .

      请注意,您可以轻松排除系统对象,请参阅注释的 where 子句

      select 
          class_desc 
          ,USER_NAME(grantee_principal_id) as user_or_role
          ,CASE WHEN class = 0 THEN DB_NAME()
                WHEN class = 1 THEN ISNULL(SCHEMA_NAME(o.uid)+'.','')+OBJECT_NAME(major_id)
                WHEN class = 3 THEN SCHEMA_NAME(major_id) END [Securable]
          ,permission_name
          ,state_desc
          ,'revoke ' + permission_name + ' on ' +
              isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)+ ' from [' +
              USER_NAME(grantee_principal_id) + ']' as 'revokeStatement'
          ,'grant ' + permission_name + ' on ' +
              isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)+ ' to ' +
              '[' + USER_NAME(grantee_principal_id) + ']' as 'grantStatement'
      FROM sys.database_permissions dp
      LEFT OUTER JOIN sysobjects o
          ON o.id = dp.major_id
      -- where major_id >= 1  -- ignore sysobjects
      
      order by 
          class_desc desc
          ,USER_NAME(grantee_principal_id)
          ,CASE WHEN class = 0 THEN DB_NAME()
               WHEN class = 1 THEN isnull(schema_name(o.uid)+'.','')+OBJECT_NAME(major_id)
               WHEN class = 3 THEN SCHEMA_NAME(major_id) end
          ,permission_name
      

      【讨论】:

      • 这对于提供准备好运行的 GRANT 语句来说太棒了
      • 请注意,'grantStatement' 中缺少一个左方括号 - 应该是 ' to ['
      【解决方案3】:

      要列出所有可以控制的权限,您可以使用函数fn_my_permission。此查询列出了 服务器 上的所有权限:

      select * from fn_my_permissions(NULL, NULL)
      

      您必须使用具有系统管理员角色的帐户登录。

      您可以使用以下参数优化函数调用。

      对于数据库的所有权限:

      select * from fn_my_permissions(NULL, 'database')
      

      对于 dbo 架构的所有权限:

      select * from fn_my_permissions('dbo', 'schema')
      

      对于表的所有权限:

      select * from fn_my_permissions('dbo.test', 'object')
      

      【讨论】:

        【解决方案4】:

        要查看特定数据库的所有授权,请使用以下命令:

        Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES
        

        要查看特定数据库的删除授权,请使用:

        Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE'
        

        【讨论】:

          【解决方案5】:

          要查看整个数据库的授权,请选择有问题的数据库,打开一个新的查询窗口,输入 - sp_helprotect,执行查询

          【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-09-19
          • 2021-06-20
          • 2018-08-06
          • 2016-05-05
          • 2014-08-16
          • 2011-03-06
          • 1970-01-01
          • 2011-06-28
          相关资源
          最近更新 更多