2009-01-30 264 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 
相關問題