如何查看SQL数据库的所有授权?

Joe*_*ggs 16 sql permissions sql-server-2005

我正在使用SQL Server 2005,我想知道所有表的特定数据库上的所有授权.它还有助于找出为特定用户提供删除授权的所有表.

注意:这可能与此问题类似,但我无法让选定答案的解决方案正常工作(如果有人可以提供更好的示例,如何使用它,它也会有帮助)

K. *_*ley 20

给定的解决方案不包括针对架构或数据库本身授予权限的位置,该架构也会对表授予权限.这也会给你这些情况.您可以对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
Run Code Online (Sandbox Code Playgroud)

此外,需要检查db_datawriter的成员资格,因为它提供了隐式的INSERT,UPDATE和DELETE权限,这意味着您不会在权限DMV或其衍生产品中看到它.


小智 9

我喜欢 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
Run Code Online (Sandbox Code Playgroud)


Ada*_*dam 5

要查看特定数据库上的所有授权,请使用:

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES
Run Code Online (Sandbox Code Playgroud)

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

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE'
Run Code Online (Sandbox Code Playgroud)


spl*_*tne 5

要列出可以控制的所有权限,您可以使用该功能fn_my_permission.此查询列出服务器上的所有权限:

select * from fn_my_permissions(NULL, NULL)
Run Code Online (Sandbox Code Playgroud)

您必须使用具有sysadmin角色的帐户登录.

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

对于数据库的所有权限:

select * from fn_my_permissions(NULL, 'database')
Run Code Online (Sandbox Code Playgroud)

对于dbo 架构的所有权限:

select * from fn_my_permissions('dbo', 'schema')
Run Code Online (Sandbox Code Playgroud)

对于表的所有权限:

select * from fn_my_permissions('dbo.test', 'object')
Run Code Online (Sandbox Code Playgroud)