カテゴリ:

コンテキスト関数

POLICY_CONTEXT

1つまたは複数のコンテキスト関数の値に基づいてクエリの結果をシミュレートし、ポリシーがクエリの結果にどのように影響するかを判断できます。コンテキスト関数は、クエリの現在のコンテキスト、たとえばクエリを実行している人やクエリを実行しているアカウントに基づいて値を返します。ポリシー本文は、ポリシーから返す値を決定するために、しばしばコンテキスト関数を使用します。

この関数は、以下のポリシーを評価してクエリ結果を決定します。

構文

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

        • ACCOUNT の APPLY AGGREGATION POLICY または AGGREGATION POLICY policy_name の APPLY

        • ACCOUNT の APPLY PROJECTION POLICY または PROJECTION 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