カテゴリ:

コンテキスト関数

POLICY_CONTEXT

マスキングポリシー で保護されているテーブルまたはビューの列、あるいは 行アクセスポリシー で保護されているテーブルまたはビューのクエリ結果をシミュレートし、テーブルまたはビューが両方のタイプのポリシーで保護されている場合は、その両方のクエリ結果をシミュレートします。

構文

EXECUTE USING
POLICY_CONTEXT( <arg_1> => '<string_literal>' [ , <arg_2> => '<string_literal>' , ... , <arg_n> => '<string_literal>' ] )
AS
SELECT <query>
Copy

引数

arg_1 => 'string_literal'

コンテキスト関数とその値を文字列として指定します。

必須です。少なくとも1つの関数とその値を指定する必要があります。

Snowflakeは、次のコンテキスト関数とその値を引数としてサポートしています。

文字列値として使用する形式を決定するには、関数を使用してクエリを実行します。例:

SELECT CURRENT_USER();

+----------------+
| CURRENT_USER() |
|----------------|
| JSMITH         |
+----------------+
Copy

文字列値は 'JSMITH' である必要があります。

CURRENT_AVAILABLE_ROLES と、 ROLE1ROLE2 などの複数のロールの値を指定する場合は、次のようにロールのリストを角かっこで囲んでください。

['ROLE1', 'ROLE2']

arg_2 => 'string_literal' , ... , arg_n => 'string_literal'

コンテキスト関数とその値のコンマ区切りリストを文字列として指定します。

オプションです。

query

1つ以上のテーブルまたはビューをクエリする SQL 式を指定します。

必須です。

使用上の注意

  • この関数には次が必要です。

    • サポートされているコンテキスト関数とその値を指定する少なくとも1つの引数。

    • テーブルがポリシーによって保護されている場合は、指定されたユーザーまたはロールに次の権限を付与する必要があります。

      • テーブルまたはビューに対する OWNERSHIP、 および

      • アカウントレベルまたはポリシー自体のいずれかにおける、ポリシーの APPLY 権限。

        • ACCOUNT での APPLY MASKING POLICY または MASKING POLICY policy_name での APPLY

        • ACCOUNT での APPLY ROW ACCESS POLICY または ROW ACCESS POLICY policy_name での APPLY

  • 次の条件のいずれかが当てはまる場合、Snowflakeはエラーメッセージを返します。

    • サポートされていない1つ以上の関数を引数として使用する。Snowflakeは、 引数 セクションにリストされている関数のみをサポートします。

    • 存在しない値(例: アカウント、ユーザー、またはロールがない)に文字列を使用するなど、関数文字列値を適切に指定していない。

    • SELECT query 式は、テーブルまたはビューを適切にクエリしません(例: テーブルまたはビューをまったく指定しない)。

    • 特定のデータ共有が事例に当てはまる(次の箇条書きを参照)。

  • データ共有:

    • データ共有コンシューマーは、この関数を使用して、データ共有プロバイダーによって使用可能にされたテーブルまたはビューのクエリ結果をシミュレートすることはできません。

      さらに、コンシューマー query 式に、 Secure Data Sharing を通じて利用可能になったテーブルまたはビューと、データ共有プロバイダーアカウントに関連付けられていないコンシューマーアカウント内の別のテーブルまたはビュー(つまり、独自のテーブルまたはビュー)が含まれる場合、Snowflakeはエラーメッセージを返します。

    • データ共有プロバイダーアカウントは、データ共有コンシューマーアカウントが、テーブルまたは共有を通じて利用可能になったビューをどのように表示するかをシミュレートできます。

      これを実行するには、データ共有プロバイダーは引数としてコンシューマーアカウント名を指定します。例:

      execute using policy_context(current_account => '<consumer_account_name>') ... ;
      
      Copy
  • 結果は次によって異なります。

    • 列に設定されているマスキングポリシー(ある場合)。

    • テーブルまたはビューに設定されている行アクセスポリシー(ある場合)。

    • ポリシー定義。

    • query 式。

    • ロールに付与された権限。

    • ユーザーに付与されたロール(ロール階層を含む)。

    • この関数の引数。

    重要

    この関数の結果が期待したもの ではない 場合、

    • 内部ポリシー管理者(例: POLICY_ADMINMASKING_ADMINRAP_ADMIN カスタムロールを持つユーザー)に相談して、マスキングポリシーによって保護される列、テーブルまたはビューを保護する行アクセスポリシー、および対応ポリシー定義を理解してください。

    • 以下を再確認します。

      • 関数文字列値。

      • SELECT query 式。

      • ロールに付与 された権限(例: テーブルまたはビューの SELECT、親データベースとスキーマの USAGE)および対応する 権限の継承

      • 特に CURRENT_AVAILABLE_ROLES 関数とその値をこの関数の引数として指定する場合は、 ロール階層

    必要に応じて、この関数を使用して SQL ステートメントを更新し、再試行します。

テーブル empl_info をクエリする PUBLIC システムロールの効果をシミュレートします。

execute using policy_context(current_role => 'PUBLIC') as select * from empl_info;
Copy