アクセス制御の問題のトラブルシューティング

クエリの実行に使用されているロールに必要なアクセス制御権限がないために SQL ステートメントが失敗する場合は、EXPLAIN_PRIVILEGES 関数を使用して、不足している権限を正確に判断できます。

管理者としてのトラブルシューティング

Snowflakeのすべてのオブジェクトに対して権限を持つ管理者は、任意の SQL ステートメントに対して EXPLAIN_PRIVILEGES 関数を呼び出すことができます。

Tip

オブジェクトに対する権限を持たない人が EXPLAIN_PRIVILEGES を使用してアクセス制御の問題を診断できるようにする場合は、その人に RESOLVE ALL ON ACCOUNT 権限を付与します。

例:SQL ステートメントの実行に必要なすべての権限を一覧表示

CALL EXPLAIN_PRIVILEGES(statement => 'DESC SCHEMA mydb.myschema');

出力例:

{
  "allOf": [
    {
      "privilege": "<ANY>",
      "objectType": "DATABASE",
      "objectName": "MYDB"
    },
    {
      "privilege": "MONITOR",
      "objectType": "SCHEMA",
      "objectName": "MYDB.MYSCHEMA"
    }
  ]
}

この出力は、データベース MYDB に対する何らかの権限 AND スキーマ MYDB.MYSCHEMA に対する MONITOR 権限が必要であることを示しています。

例:特定のロールに不足している権限を一覧表示

次の呼び出しは、``analyst_role``(付与されたロールからの権限を含む)が SELECT ステートメントを実行するために必要な権限を持っているかどうかを判断し、持っていない場合は不足している権限を返します。

CALL EXPLAIN_PRIVILEGES(
  statement => 'SELECT * FROM mydb.myschema.mytable',
  missing_only => true,
  for_role => 'analyst_role');

独自のクエリのトラブルシューティング

EXPLAIN_PRIVILEGES 関数を呼び出すには、クエリで参照されるオブジェクトに対して少なくとも1つの権限を持っている必要があります。オブジェクトに対するこれらの権限だけではクエリを正常に実行できない場合は、missing_only 引数を true に設定して EXPLAIN_PRIVILEGES 関数を呼び出し、必要な追加の権限を判断します。

たとえば、mydbmyschema、および mytable オブジェクトに対する権限があっても、アクセス制御の問題によりクエリが依然として失敗する場合は、次のコマンドを実行します。

CALL EXPLAIN_PRIVILEGES(
  statement => 'SELECT * FROM mydb.myschema.mytable',
  missing_only => true);

現在のロールに不足している権限がある場合、この関数は必要な特定の権限を返します。例:

{
  "allOf": [
    {
      "privilege": "SELECT",
      "objectType": "TABLE",
      "objectName": "MYDB.MYSCHEMA.MYTABLE"
    }
  ]
}