カテゴリ:

テーブル、ビュー、シーケンス DDL

CREATE ROW ACCESS POLICY

現在の/指定されたスキーマに新しい行アクセスポリシーを作成するか、既存の行アクセスポリシーを置き換えます。

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

テーブル、ビュー、シーケンス DDL

このトピックの内容:

構文

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 OR REPLACE ROW ACCESS POLICY を使用して、または ALTER ROW ACCESS POLICY を使用して、ポリシー署名(つまり、引数名または入出力データ型)を変更することはできません。署名を変更する必要がある場合は、ポリシーで DROP ROW ACCESS POLICY ステートメントを実行し、新しい行アクセスポリシーを作成します。

次の行アクセスポリシーでは、 CURRENT_ROLEit_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つの条件のいずれかを満たしている場合、ユーザーはデータを表示できます。

  1. 現在のロールは sales_executive_role カスタムロールです。 CURRENT_ROLE 関数をクエリして、現在のロールを判別します。

  2. 現在のロールは 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)

行アクセスポリシーの署名。

このポリシーがデータベースオブジェクトに追加され、指定された列のいずれかがデータベースオブジェクトのクエリに含まれている場合、Snowflakeはクエリ結果の行を返しません。

returns boolean -> true

行アクセスポリシーの適用を決定します。

戻り値は、行アクセスポリシーが追加されたデータベースオブジェクトの特定の行に、ユーザーがアクセスできるかどうかを決定します。