web-dev-qa-db-ja.com

SQLデータベースのすべての権限を表示するにはどうすればよいですか?

私はSQL Server 2005を使用していますが、すべてのテーブルの特定のデータベースに対するすべての権限が何であるかを知りたいのです。また、特定のユーザーに削除権限が与えられているすべてのテーブルを見つけるのにも役立ちます。

注:これは この質問 に似ているかもしれませんが、選択した回答のソリューションを機能させることができませんでした(誰かがそれを使用する方法のより良い例を提供できれば、それも役立ちます)

16
Joel Briggs

与えられたソリューションは、スキーマまたはデータベース自体に対して権限が付与される場所をカバーしていません。これらは、テーブルに対しても権限を付与します。これはあなたにもそれらの状況を与えるでしょう。 permit_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またはその派生物に表示されません。

22
K. Brian Kelley

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
5
jgoerke

制御可能なすべての権限を一覧表示するには、関数fn_my_permissionを使用できます。このクエリは、serverのすべての権限を一覧表示します。

select * from fn_my_permissions(NULL, NULL)

Sysadminロールを持つアカウントを使用してログインする必要があります。

次のパラメーターを使用して関数呼び出しを調整できます。

データベースのすべての権限について:

select * from fn_my_permissions(NULL, 'database')

Dboのすべてのアクセス許可についてスキーマ

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

tableのすべての権限について:

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

特定のデータベースのすべての許可を表示するには、次を使用します。

Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES

特定のデータベースの削除権限を表示するには、次のようにします。

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

DB全体に対する権限を確認するには、問題のDBを選択し、新しいクエリウィンドウを開いて-sp_helprotect、クエリを実行します

2
audiphilth