[新機能]Snowflakeでユーザー定義のタグが下流のオブジェクトに自動伝搬される機能が一般提供となりました
さがらです。
Snowflakeでユーザー定義のタグが下流のオブジェクトに自動伝搬(Automatic propagation)される機能が一般提供となりました。
実際にこの機能を試してみたので、その内容をまとめてみます。
試す内容
まず、以下のブログに沿ってタグベースのマスキングポリシーを適用したテーブルを作成しておきます。
その後、タグの自動伝搬機能を有効化し、タグを付与したテーブルを参照するテーブルを作成したときにタグが伝搬されているかを確認してみます。
タグの自動伝搬機能の有効化
以下のドキュメントに沿って、タグの自動伝搬を有効化します。
-- タグを作成したロールに対して、apply tag on account権限を付与(自動伝搬の有効化にはこの権限が必要)
use role accountadmin;
grant apply tag on account to role sysadmin;
-- タグを作成したロールで操作
use role sysadmin;
use schema security.tags;
-- タグの自動伝搬を有効化
alter tag pii_info set propagate = on_dependency_and_data_movement;
テーブルを作成し、タグの自動伝搬を確認
以下のクエリを実行し、タグを付与したテーブルを参照しつつ一部のカラムは加工して、新しいテーブルを作成します。
use role dev_role;
use schema app_data.public;
-- customer_dev テーブルを参照し、データ変換を行って新しい通常のテーブルを作成
create or replace table customer_dev_transformed as
select
    id,
    upper(name) as transformed_name,                   -- name を大文字に変換
    case
        when length(ssn) = 11 and ssn like '___-__-____' then 'xxx-xx-' || substring(ssn, 8, 4)
        else 'invalid ssn format'
    end as masked_ssn,                                 -- ssn をマスキング (例: xxx-xx-9999)
    salary as annual_salary,
    round(salary / 12, 2) as monthly_salary,           -- salary を月給に変換 (小数点第2位で四捨五入)
    case
        when salary >= 70000 then 'high'
        else 'standard'
    end as salary_level,                               -- 給与レベルを追加
    current_timestamp() as snapshot_timestamp          -- スナップショット取得時刻
from customer_dev;
この上で、作成したテーブルに対してGET_DDL関数を実行すると、以下の結果を得られました。
create or replace TABLE CUSTOMER_DEV_TRANSFORMED (
	ID NUMBER(38,0) WITH TAG (SECURITY.TAGS.PII_INFO='-'),
	TRANSFORMED_NAME VARCHAR(16777216) WITH TAG (SECURITY.TAGS.PII_INFO='pii'),
	MASKED_SSN VARCHAR(16777216) WITH TAG (SECURITY.TAGS.PII_INFO='pii'),
	ANNUAL_SALARY NUMBER(38,0) WITH TAG (SECURITY.TAGS.PII_INFO='pii'),
	MONTHLY_SALARY NUMBER(38,2) WITH TAG (SECURITY.TAGS.PII_INFO='pii'),
	SALARY_LEVEL VARCHAR(8),
	SNAPSHOT_TIMESTAMP TIMESTAMP_LTZ(9)
);
表にまとめるとこのようになります。完全に新規の計算列となった場合には、タグが伝搬されないようです。
| 変換後の列名 | 変換内容 | PIIのタグの伝播状況 (SECURITY.TAGS.PII_INFO) | 
|---|---|---|
| ID | 元の id 列をそのまま使用 | 
'-' (伝播) | 
| TRANSFORMED_NAME | 元の name 列の値をすべて大文字に変換 (UPPER(name)) | 
'pii' (伝播) | 
| MASKED_SSN | 元の ssn 列の末尾4桁以外をマスキング | 
'pii' (伝播) | 
| ANNUAL_SALARY | 元の salary 列をそのまま使用(年俸として) | 
'pii' (伝播) | 
| MONTHLY_SALARY | 元の salary 列を12で割り月給を計算し、小数点第2位で四捨五入 (ROUND(salary / 12, 2)) | 
'pii' (伝播) | 
| SALARY_LEVEL | 元の salary 列の値に基づき給与レベルを判定 (CASE WHEN salary >= 70000 THEN 'high' ELSE 'standard' END) | 
タグなし (新規の計算列のため) | 
| SNAPSHOT_TIMESTAMP | テーブル作成(スナップショット取得)時のタイムスタンプを記録 (CURRENT_TIMESTAMP()) | 
タグなし (新規の計算列のため) | 
また、タグベースのマスキングポリシーを適用しているため、データを見ることができないロールからクエリを行うと、下図のようにマスクされて表示されます。
-- analysis_roleから確認 ※マスキングされる
use role analysis_role;
select * from app_data.public.customer_dev_transformed;

最後に
Snowflakeでユーザー定義のタグが下流のオブジェクトに自動伝搬(Automatic propagation)される機能が一般提供となったので、試してみました。
RAW層のテーブルにだけ定義しておけば、自動でタグが伝搬され、マスキングも行われていくため、非常に便利な機能だと思います!一般提供となっておりますので、ぜひご活用ください。







