[新機能]Snowflakeでユーザー定義のタグが下流のオブジェクトに自動伝搬される機能が一般提供となりました

[新機能]Snowflakeでユーザー定義のタグが下流のオブジェクトに自動伝搬される機能が一般提供となりました

Clock Icon2025.05.15

さがらです。

Snowflakeでユーザー定義のタグが下流のオブジェクトに自動伝搬(Automatic propagation)される機能が一般提供となりました。

https://docs.snowflake.com/en/release-notes/2025/other/2025-05-14-tag-propagation

https://docs.snowflake.com/en/user-guide/object-tagging/propagation

実際にこの機能を試してみたので、その内容をまとめてみます。

試す内容

まず、以下のブログに沿ってタグベースのマスキングポリシーを適用したテーブルを作成しておきます。

https://dev.classmethod.jp/articles/snowflake-tag-based-masking-policies-with-tag-value/

その後、タグの自動伝搬機能を有効化し、タグを付与したテーブルを参照するテーブルを作成したときにタグが伝搬されているかを確認してみます。

タグの自動伝搬機能の有効化

以下のドキュメントに沿って、タグの自動伝搬を有効化します。

https://docs.snowflake.com/en/user-guide/object-tagging/work#id1

-- タグを作成したロールに対して、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;

2025-05-15_18h11_56

最後に

Snowflakeでユーザー定義のタグが下流のオブジェクトに自動伝搬(Automatic propagation)される機能が一般提供となったので、試してみました。

RAW層のテーブルにだけ定義しておけば、自動でタグが伝搬され、マスキングも行われていくため、非常に便利な機能だと思います!一般提供となっておりますので、ぜひご活用ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.