2009-01-30 263 views
10

我正在使用SQL Server 2005,我想知道所有表的特定数据库上的所有授权。这也有助于找出为特定用户提供删除资助的所有表格。如何查看SQL数据库的所有授权?

注:这可能是类似于this question,但我不能让所选答案的解决方案时(如果有人可以提供如何使用一个更好的例子,这将有助于为好)

回答

15

给定的解决方案不包括对模式或数据库本身授予权限的位置,这也授予针对表的权限。这也会给你这些情况。您可以使用针对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或其衍生物出现。

4

要查看所有特定的数据库上的许可使用:

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES 

来只查看删除特定的数据库使用赠款这样的:

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

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

+2

则sp_helprotect在SQL 2005和更高弃用。请参阅http://msdn.microsoft.com/en-us/library/ms190310.aspx – 2011-11-30 14:58:00

3

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

select * from fn_my_permissions(NULL, NULL) 

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

您可以使用以下参数改进函数调用。

有关数据库的所有权限:在

​​

对于所有权限:

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

select * from fn_my_permissions(NULL, 'database') 

有关DBO所有权限模式

4

我喜欢K.布赖恩凯利的答案,但我想要更多的信息(如架构)以及生成相应的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 
相关问题