web-dev-qa-db-ja.com

ロールに付与された実行権限を検出するにはどうすればよいですか(ON句が使用されていない場合)

アプリにストアドプロシージャを実行する特権がどのようにあるかを理解するために何時間も費やしました。

[〜#〜] til [〜#〜]StackExchangeから:ON句はGRANTでは省略可能であり、ロールの実行を許可できるすべて。構文を検証するために最善を尽くした後、このMSDNページの一番下を笑わなければなりませんでした。

GRANTオブジェクトのアクセス許可(Transact-SQL)

_CREATE ROLE Test
GRANT EXECUTE TO Test
_

わかりました。それでかっこいいです(あまり重要でない特権の原則ではありません)。

ただし:その付与を検出または検出するにはどうすればよいですか?

SQL Server Management Studioのすべてのログイン、ロール、ユーザー、スキーマ特権のGUIを調べてみましたが、このタイプの付与がどこにも特定されていません。

デバッグ中に、クエリで特権を列挙することについての質問が見つかりましたが、それらは関連していますが、このシナリオについては言及も回答も含まれていません。

特権を付与(または拒否)するこの方法を特定する最も信頼できる方法を探しています。

3
colbybhearn

私は、この質問に対する Kin's answer からのクエリの結果に注意を払っていなかったか、正しく解釈していませんでした。

特定のロールのすべての権限をリストしますか?

クエリの結果には、executeがリストされていますが、特定のオブジェクトタイプまたはオブジェクト名はありません。

2
colbybhearn

GRANT EXECUTE TO [principal]は単にGRANT EXECUTE ON DATABASE::<dbname> TO [principal];のショートカットです

これは次の方法で確認できます。

SELECT dp.name
    , perms.class_desc
    , perms.permission_name
    , perms.state_desc
FROM sys.database_permissions perms
    INNER JOIN sys.database_principals dp ON perms.grantee_principal_id = dp.principal_id 
WHERE dp.name = 'MyRole'
5
Max Vernon

Max Vernonの回答を補足するには:

SELECT *
FROM sys.objects
WHERE object_id IN (
         SELECT major_id
         FROM sys.database_permissions perms
            INNER JOIN sys.database_principals dp
               ON perms.grantee_principal_id = dp.principal_id 
         WHERE dp.name = 'ProdConfigUsers' 
      )
AND name like '%%'
ORDER BY create_date DESC
1
freethinker6