私はSQL Server 2005を使用していますが、すべてのテーブルの特定のデータベースに対するすべての権限が何であるかを知りたいのです。また、特定のユーザーに削除権限が与えられているすべてのテーブルを見つけるのにも役立ちます。
注:これは この質問 に似ているかもしれませんが、選択した回答のソリューションを機能させることができませんでした(誰かがそれを使用する方法のより良い例を提供できれば、それも役立ちます)
与えられたソリューションは、スキーマまたはデータベース自体に対して権限が付与される場所をカバーしていません。これらは、テーブルに対しても権限を付与します。これはあなたにもそれらの状況を与えるでしょう。 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またはその派生物に表示されません。
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
制御可能なすべての権限を一覧表示するには、関数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')
特定のデータベースのすべての許可を表示するには、次を使用します。
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES
特定のデータベースの削除権限を表示するには、次のようにします。
Select * from INFORMATION_SCHEMA.TABLE_PRIVILEGES WHERE PRIVILEGE_TYPE = 'DELETE'
DB全体に対する権限を確認するには、問題のDBを選択し、新しいクエリウィンドウを開いて-sp_helprotect
、クエリを実行します