カテゴリ:

システム関数 (システム情報)

EXPLAIN_PRIVILEGES

SQLステートメントを実行するために必要な権限を説明するJSON文字列を返します。この関数は、特定のSQLステートメントの認可要件を分析し、必要な権限、オブジェクト型、オブジェクト名を示す構造化された形式で返します。

こちらもご参照ください。

GRANT <権限> ... TO ROLE, SHOW GRANTS

構文

EXPLAIN_PRIVILEGES(
  statement => '<sql_statement>'
  [, missing_only => <boolean> ]
  [, for_role => '<role_name>' ])

引数

statement => 'sql_statement'

分析するSQLステートメントを含む文字列。ステートメントが分析され、その実行に必要な権限が判断されます。

missing_only => boolean

出力モードを制御するブール値:

  • false - 現在のユーザーまたは指定されたロールが持っているかどうかに関係なく、ステートメントの実行に必要なすべての権限を返します。

  • true — 欠落している(現在のユーザーまたは指定されたロールが現在保持していない)権限のみを返します。必要なすべての権限が存在する場合は、``{"authorized": true}``を返します。

デフォルト: false

for_role => 'role_name'

権限を確認するロールの名前。この引数は``missing_only => true``の場合にのみ使用されます。ステートメントを実行するために、ロール(およびその付与されたロール)に欠落しているすべての権限を返します。

戻り値

この関数は、必要な権限を階層構造で記述したJSONオブジェクトを含むVARCHAR値を返します。JSONには次のノードタイプを含めることができます:

Permission Node — 単一の権限要件を表します:

{
  "privilege": "<privilege_name>",
  "objectType": "<object_type>",
  "objectName": "<fully_qualified_object_name>"
}
  • privilege — 必要な権限の名前(たとえば、USAGE、SELECT、OWNERSHIP)。特別な値``<ANY>``は、オブジェクトに対する任意の権限で十分であることを示します。

  • objectType — オブジェクトの型(たとえば、DATABASE、TABLE、SCHEMA、ACCOUNT)。

  • objectName — オブジェクトの完全修飾名。

AND Node — 含まれるすべての権限が必要です:

{
  "allOf": [
    /* ... permissions or nodes */
  ]
}

OR Node — 含まれる権限の少なくとも1つが必要です:

{
  "oneOf": [
    /* ... permissions or nodes */
  ]
}

Decision Node — 認可ステータスを示します

{
  "authorized": true
}
  • authorized: true — 必要なすべての権限が存在します。

  • authorized: false — ステートメントは権限の付与では認可できません。

アクセス制御の要件

SQLステートメントで名前によってオブジェクトを参照する権限が必要です。通常、この要件は、オブジェクトに対して少なくとも1つの権限を持つことで満たされます。RESOLVE ALL ON ACCOUNT権限もこの要件を満たします。

使用上の注意

  • ``statement``引数は定数式である必要があります。列の値やその他の非定数式を渡すことはできません。

  • マルチステートメントSQLはサポートされていません。この関数は単一のSQLステートメントのみを受け入れます。

  • 一部のSQLステートメントは、権限分析をサポートしていません(たとえば、GRANT、REVOKE、USE ROLE、USE SECONDARY ROLES)。

  • 一部のSQLステートメントには、権限分析でサポートされていない権限チェックがあります。これらのチェックは出力から省略されます。

  • 一部の間接的な権限チェックは、権限分析でサポートされていません。これらのチェックは出力から省略されます。たとえば、RESOLVE ALL ON ACCOUNTはデータベースを解決するためのオプションとして含まれていません。

  • オブジェクトを解決できない場合、関数は、ステートメントがすべてのオブジェクトへのアクセスを必要とすることを示すエラーを返します。

  • 権限``<ANY>``は、オブジェクトに対する任意の権限で十分であることを意味します(たとえば、OWNERSHIPでも十分なUSAGEチェックの場合など)。

以下の例では、 EXPLAIN_GRANTABLE_PRIVILEGES関数を呼びだしています。

DESCコマンドの権限を説明する

スキーマを記述するために必要なすべての権限を表示します。

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 権限が必要であることを示しています。

欠落している権限のみを確認する

現在のユーザーに対してどの権限が欠落しているかを確認します:

CALL EXPLAIN_PRIVILEGES(
  statement => 'DROP TABLE mydb.myschema.mytable',
  missing_only => true);

必要な権限がすべてある場合は、次を返します:

{
  "authorized": true
}

権限が欠落している場合は、欠落している権限のみを返します:

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

特定のロールの欠落している権限を確認する

特定のロールにどのような権限が欠落しているかを確認します:

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

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