- カテゴリ:
CREATE ROW ACCESS POLICY¶
現在/指定のスキーマに新しい行アクセスポリシーを作成するか、既存の行アクセスポリシーを置き換えます。
行アクセスポリシーを作成した後、 ALTER TABLE コマンドを使用してテーブルにポリシーを追加するか、 ALTER VIEW コマンドを使用してビューにポリシーを追加します。
- こちらもご参照ください。
テーブル、ビュー、シーケンス DDL、 DROP ROW ACCESS POLICY 、 ALTER ROW ACCESS POLICY、 SHOW ROW ACCESS POLICIES、 DESCRIBE ROW ACCESS POLICY
このトピックの内容:
構文¶
Snowflakeは、行アクセスポリシーを作成するために次の構文をサポートしています。
CREATE [ OR REPLACE ] ROW ACCESS POLICY [ IF NOT EXISTS ] <name> AS
( <arg_name> <arg_type> [ , ... ] ) RETURNS BOOLEAN -> <expression>
[ COMMENT = '<string_literal>' ]
必須パラメーター¶
名前
アクセスポリシーの識別子。スキーマに対して一意である必要があります。
識別子の値はアルファベットで始まる必要があり、識別子文字列全体が二重引用符で囲まれていない限り、スペースや特殊文字を含めることはできません(例: 「私のオブジェクト」)。二重引用符で囲まれた識別子も大文字と小文字が区別されます。
詳細については、 識別子の要件 をご参照ください
AS ( <引数名> <引数型> [ , ... ] )
行アクセスポリシーの署名。
署名は、行にアクセスできるかどうかを判断するために考慮する必要のある属性のセットを指定します。属性値は、行アクセスポリシーによって保護されるデータベースオブジェクト(例: テーブルまたはビュー)から取得されます。
RETURNS BOOLEAN -> <式>
行アクセスポリシーの適用を決定します。
戻り値は、行アクセスポリシーが追加されたデータベースオブジェクトの特定の行に、ユーザーがアクセスできるかどうかを決定します。
式には、ブール値の SQL 式を使用できます。Snowflakeは、 UDFs (ユーザー定義関数)、 外部関数 を呼び出す式、およびサブクエリを使用する式をサポートしています。
オプションのパラメーター¶
COMMENT = '文字列リテラル'
行アクセスポリシーのコメントを指定します。
デフォルト: 値なし
使用上の注意¶
行アクセスポリシーを作成するには、現在または指定されたスキーマに対する CREATE ROW ACCESS POLICY 権限が必要です。
ポリシー本体に1つ以上の サブクエリ を含めると、エラーが発生する可能性があります。可能であれば、サブクエリの数を制限し、 JOIN 操作の数を制限し、 WHERE 句の条件を単純化します。
データベースオブジェクトに行アクセスポリシーと1つ以上の 列レベルのセキュリティ マスキングポリシーの両方がある場合、行アクセスポリシーが最初に評価されます。
クエリ実行時の行アクセスポリシーの詳細については、 行アクセスポリシーの理解 をご参照ください。
特定のテーブルまたはビュー列は、マスキングポリシー署名または行アクセスポリシー署名のいずれかで指定できます。つまり、マスキングポリシー署名と行アクセスポリシー署名の両方で同時に同じ列を指定することはできません。
詳細については、 CREATE MASKING POLICY をご参照ください。
ポリシーがテーブルまたはビューにアタッチされている場合は、 CREATE OR REPLACE ROW ACCESS POLICY を使用して、または ALTER ROW ACCESS POLICY を使用して、ポリシー署名(つまり、引数名または入出力データ型)を変更することはできません。署名を変更する必要がある場合は、ポリシーで DROP ROW ACCESS POLICY ステートメントを実行し、新しい行アクセスポリシーを作成します。
データ共有プロバイダーは、 リーダーアカウント には行アクセスポリシーを作成できません。
メタデータについて。
注意
Snowflakeサービスを使用する場合、お客様は、個人データ(ユーザーオブジェクト向け以外)、機密データ、輸出管理データ、またはその他の規制されたデータがメタデータとして入力されていないことを確認する必要があります。詳細については、 Snowflakeのメタデータフィールド をご参照ください。
例¶
次の行アクセスポリシーでは、 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
行アクセスポリシーの適用を決定します。
戻り値は、行アクセスポリシーが追加されたデータベースオブジェクトの特定の行に、ユーザーがアクセスできるかどうかを決定します。