CREATE ROW ACCESS POLICY¶
現在/指定のスキーマに新しい行アクセスポリシーを作成するか、既存の行アクセスポリシーを置き換えます。
行アクセスポリシーを作成した後、 ALTER TABLE コマンドを使用してテーブルにポリシーを追加するか、 ALTER VIEW コマンドを使用してビューにポリシーを追加します。
- こちらもご参照ください。
構文¶
Snowflakeは、行アクセスポリシーを作成するために次の構文をサポートしています。
CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ] <name> AS
( <arg_name> <arg_type> [ , ... ] ) RETURNS BOOLEAN -> <body>
[ COMMENT = '<string_literal>' ]
必須パラメーター¶
nameアクセスポリシーの識別子。スキーマに対して一意である必要があります。
識別子の値はアルファベットで始まる必要があり、識別子文字列全体が二重引用符で囲まれていない限り、スペースや特殊文字を含めることはできません(例: 「私のオブジェクト」)。二重引用符で囲まれた識別子も大文字と小文字が区別されます。
詳細については、 識別子の要件 をご参照ください
AS ( <arg_name> <arg_type> [ , ... ] )行アクセスポリシーの署名。
署名は、行にアクセスできるかどうかを判断するために考慮する必要のある属性のセットを指定します。属性値は、行アクセスポリシーによって保護されるデータベースオブジェクト(例: テーブルまたはビュー)から取得されます。
RETURNS BOOLEAN行アクセスポリシーはtrueまたはfalseと評価される必要があります。行アクセスポリシーで保護されたテーブルをクエリするユーザには、
bodyの記述方法に基づいて出力に行が表示されます。bodyシグネチャの引数値を操作して、行アクセスポリシーで保護されているテーブルのクエリに対してどの行を返すかを決定する SQL 式。
bodyには、任意のブール値の SQL 式を使用できます。Snowflakeは、 ユーザー定義関数の概要、 外部関数の記述 を呼び出す式、およびサブクエリを使用する式をサポートしています。
オプションのパラメーター¶
COMMENT = 'string_literal'行アクセスポリシーのコメントを指定します。
デフォルト: 値なし
アクセス制御の要件¶
この操作の実行に使用される ロール には、少なくとも次の 権限 が必要です。
権限 |
オブジェクト |
注意 |
|---|---|---|
CREATE ROW ACCESS POLICY |
スキーマ |
スキーマ内のオブジェクトに対して操作を実行するには、親データベースとスキーマに対する USAGE 権限が必要です。スキーマに対する 任意の権限を付与されたロールは、そのロールがスキーマを解決できることに注意してください。たとえば、スキーマに対するCREATE権限を付与されたロールは、そのスキーマにオブジェクトを作成できますが、そのスキーマに対するUSAGE*も*付与されている必要はありません。
指定された権限のセットを使用してカスタムロールを作成する手順については、 カスタムロールの作成 をご参照ください。
セキュリティ保護可能なオブジェクト に対して SQL アクションを実行するためのロールと権限付与に関する一般的な情報については、 アクセス制御の概要 をご参照ください。
マスキングポリシー DDL と権限の詳細については、 列レベルのセキュリティの管理 をご参照ください。
使用上の注意¶
ポリシー本体に1つ以上の サブクエリ を含めると、エラーが発生する可能性があります。可能であれば、サブクエリの数を制限し、 JOIN 操作の数を制限し、 WHERE 句の条件を単純化します。
データベースオブジェクトに行アクセスポリシーと1つ以上の マスキングポリシー の両方がある場合は、行アクセスポリシーが最初に評価されます。
クエリ実行時の行アクセスポリシーの詳細については、 行アクセスポリシーについて をご参照ください。
特定のテーブルまたはビュー列は、マスキングポリシー署名または行アクセスポリシー署名のいずれかで指定できます。つまり、マスキングポリシー署名と行アクセスポリシー署名の両方で同時に同じ列を指定することはできません。
詳細については、 CREATE MASKING POLICY をご参照ください。
ポリシーがテーブルまたはビューにアタッチされている場合は、 CREATE OR REPLACE ROW ACCESS POLICY を使用して、または ALTER ROW ACCESS POLICY を使用して、ポリシー署名(つまり、引数名または入出力データ型)を変更することはできません。署名を変更する必要がある場合は、ポリシーで DROP ROW ACCESS POLICY ステートメントを実行し、新しい行アクセスポリシーを作成します。
ポリシー
bodyにマッピングテーブルルックアップが含まれている場合は、一元化されたマッピングテーブルを作成し、保護されたテーブルと同じデータベースにマッピングテーブルを格納します。これは、bodyが IS_DATABASE_ROLE_IN_SESSION 関数を呼び出す場合に特に重要です。詳細については、関数の使用上の注意をご参照ください。データ共有プロバイダーは、 リーダーアカウント には行アクセスポリシーを作成できません。
マスキングまたは行アクセスポリシーの本文で CURRENT_DATABASE または CURRENT_SCHEMA 関数を指定した場合、この関数は、セッションで使用されているデータベースまたはスキーマではなく、保護されたテーブルを含むデータベースまたはスキーマを返します。
メタデータについて。
注意
Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。
OR REPLACEとIF NOT EXISTS句は互いに排他的です。両方を同じステートメントで使うことはできません。CREATE OR REPLACE <オブジェクト> ステートメントはアトミックです。つまり、オブジェクトが置き換えられると、単一のトランザクションで、古いオブジェクトが削除されて新しいオブジェクトが作成されます。
例¶
これらの例では、 CURRENT_ROLE コンテキスト関数を使用しています。ポリシー条件でロールのアクティブ化とロール階層が必要な場合は、 IS_ROLE_IN_SESSION を使用します。
次の行アクセスポリシーでは、 CURRENT_ROLE が it_admin カスタムロールのユーザーである場合、クエリ結果に従業員 ID 番号(つまり、 empl_id)を含む行を表示できます。
create or replace row access policy rap_it as (empl_id varchar) returns boolean -> case when 'it_admin' = current_role() then true else false end ;
次の行アクセスポリシーでは、次に挙げる2つの条件のいずれかに該当する場合に、ユーザーはクエリ結果の行を表示できます。
現在のロールは
sales_executive_roleカスタムロールです。CURRENT_ROLE 関数を呼び出して、現在のロールを判別します。現在のロールは
sales_managerカスタムロールであり、クエリはsalesmanageregionsマッピングテーブルに対応するsales_regionを指定します。
use role securityadmin; create or replace row access policy rap_sales_manager_regions_1 as (sales_region varchar) returns boolean -> 'sales_executive_role' = current_role() or exists ( select 1 from salesmanagerregions where sales_manager = current_role() and region = sales_region ) ;条件:
rap_sales_manager_regions_1行アクセスポリシーの名前。
as (sales_region varchar)行アクセスポリシーの署名。
署名は、行にアクセスできるかどうかを判断するために考慮する必要のある属性のセットを指定します。属性値は、行アクセスポリシーによって保護されるテーブルから取得されます。
returns boolean ->行アクセスポリシーの適用を指定します。
行アクセスポリシーの
<expression>は、右矢印(つまり、->)の直後にあります。式には、ブール値の SQL 式を使用できます。Snowflakeは、 UDFs を呼び出す式、外部関数、およびサブクエリを使用する式をサポートしています。
'sales_executive_role' = current_role()sales_executive_roleカスタムロールを持つユーザーがデータを表示できるようにする、行アクセスポリシー式の最初の条件。
or exists (select 1 from salesmanagerregions where sales_manager = current_role() and region = sales_region)サブクエリを使用する行アクセスポリシー式の2番目の条件。
サブクエリでは、
salesmanagerregionsマッピングテーブルにリストされているリージョンを指定するために、データに対して実行されたクエリで CURRENT_ROLE はsales_managerカスタムロールである必要があります。
次の行アクセスポリシーは、ポリシー署名で2つの属性を指定します。
create or replace row access policy rap_test2 as (n number, v varchar) returns boolean -> true;条件:
rap_test2行アクセスポリシーの名前。
(n number, v varchar)行アクセスポリシーの署名。
署名は、行にアクセスできるかどうかを判断するために考慮する必要のある属性のセットを指定します。属性値は、行アクセスポリシーによって保護されるテーブルから取得されます。
returns boolean -> true行アクセスポリシーの適用を決定します。
戻り値は、行アクセスポリシーが追加されたデータベースオブジェクトの特定の行に、ユーザーがアクセスできるかどうかを決定します。
その他の例については、 行アクセスポリシーを使用する をご参照ください。