行アクセスポリシー
このトピックでは、行アクセスポリシーとは何か、行アクセスポリシーの作成と適用方法、典型的なシナリオでの2つのユースケース、行アクセスポリシーの管理方法、および行アクセスポリシーを使用する際の制限について説明します。
カラムおよび行レベルのセキュリティの概要については、 カラムおよび行レベルのセキュリティを理解する を参照してください。
各 SQL 操作に必要な権限については、 ポリシーの権限を管理する を参照してください。
定義
行レベルのセキュリティを使用すると、テーブルまたはビューに行アクセスポリシーを適用して、クエリ結果で表示される行を決定できます。
行アクセスポリシーのポリシー式には条件や関数を含めることができ、条件が満たされた場合にクエリ実行時にデータを変換します。
行アクセスポリシーは、テーブルの作成時または作成後にテーブルまたはビューに追加できます。
行アクセスポリシーの作成
ポリシーは、カラム名、カラムタイプ、フィルター条件、および関数で構成されます。
構文:
CREATE ROW ACCESS POLICY [ IF NOT EXISTS ] <name>
AS ( <arg_name> <arg_type> [ , ... ] )
RETURNS boolean ->
<expression_on_arg_name>
[ COMMENT = '<string_literal>' ]
パラメータ | 必須 | 説明 |
---|---|---|
name | はい | ポリシーの名前で、データベース内で一意である必要があります。ポリシーは catalog.db.policy の形式でデータベースやカタログをまたいで参照できます。カタログが指定されていない場合、現在のカタログが使用されます。 |
arg_name | はい | マスクするカラムの名前。 |
arg_type | はい | マスクするカラムのデータタイプ。 |
RETURNS | はい | 戻り値のデータタイプは BOOLEAN でなければなりません。 |
expression_on_arg_name | はい | フィルター条件として使用される式で、if()、case when()、ifnull() などの任意の条件関数を使用できます。 |
COMMENT | いいえ | ポリシーの説明。 |
例:
例 1: 行アクセスポリシーを作成し、sales_asia
が asia
地域のデータのみを、sales_uk
が uk
地域のデータのみを、ACCOUNTADMIN
がすべてのデータを参照できるようにします。
CREATE ROW ACCESS POLICY region_data AS
(region varchar) RETURNS boolean
->
CASE WHEN current_role()='sales_asia' and region='asia' THEN true
WHEN current_role()='sales_uk' and region='uk' THEN true
WHEN current_role()='ACCOUNTADMIN' THEN true
ELSE false
END
COMMENT "for test";
例 2: サブクエリを行アクセスポリシーにネストし、現在のロールが自分の地域のデータのみを参照できるようにします。
CREATE ROW ACCESS POLICY rap_sales_manager_regions_2 AS
(sales_region varchar) RETURNS boolean
->
CASE WHEN EXISTS (
select * from map
where 'role' = current_role()
and 'sales_region' = region
) THEN true
ELSE false
END;
行アクセスポリシーの適用
ポリシーが作成された後、既存のテーブルに適用できます。
構文:
ALTER TABLE <tbl_name> ADD ROW ACCESS POLICY <name> ON (<cond_col1>[, <cond_col2>, ...])
例:
ALTER TABLE `sales_info` ADD ROW ACCESS POLICY region_data ON (region);
テーブルを作成する際に WITH 句を使用して、既存の行アクセスポリシーをテーブルに適用することもできます。
構文:
CREATE [EXTERNAL] TABLE [IF NOT EXISTS] [database.]table_name
(column_definition1[, column_definition2, ...]
[, index_definition1[, index_definition2, ...]])
[ENGINE = [olap|mysql|elasticsearch|hive|iceberg|hudi|jdbc]]
[key_desc]
[COMMENT "table comment"]
[partition_desc]
distribution_desc
WITH ROW ACCESS POLICY <name> ON (<cond_col1 [, <cond_col2> , ...])
[WITH ROW ACCESS POLICY <name> ON (<cond_col12> [, <cond_col1> , ...]) ...]
[rollup_index]
[PROPERTIES ("key"="value", ...)]
[BROKER PROPERTIES ("key"="value", ...)]
例:
CREATE TABLE `sales_info` (
name varchar(50),
phone string,
region varchar(50),
sales INT)
WITH ROW ACCESS POLICY region_data ON (region);