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

时间:2009-01-30 21:28:02

标签: sql sql-server-2005 permissions

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

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

5 个答案:

答案 0 :(得分:17)

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

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或其衍生产品中看到它。

答案 1 :(得分:5)

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

的所有权限
select * from fn_my_permissions(NULL, NULL)

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

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

对于数据库的所有权限:

select * from fn_my_permissions(NULL, 'database')

对于dbo 架构的所有权限:

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

对于的所有权限:

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

答案 2 :(得分:4)

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

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES

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

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

答案 3 :(得分:4)

我喜欢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

答案 4 :(得分:2)

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