![[新機能]Snowflake のMulti-value tagsが GA になったので複数値の管理からタグ伝播のマージまで試してみた](https://images.ctfassets.net/ct0aopd36mqt/wp-refcat-img-3610e3c1ff5961bdb7b464e17f8bf06d/90b168b240005ead852ec1d474bb74fb/snowflake-logo-1200x630-1.png?w=3840&fm=webp)
[新機能]Snowflake のMulti-value tagsが GA になったので複数値の管理からタグ伝播のマージまで試してみた
かわばたです。
2026年8月25日にマルチバリュータグ が一般提供(GA)となりました。
1つのタグに複数の値を割り当てられます。「このテーブルは営業システムと会計システムの両方のデータから作られている」「このカラムは個人情報でもあり決済情報でもある」のように、複数の分類が同時に当てはまるケースをタグで表現できます。
本記事では、値の追加・削除から確認用関数 SYSTEM$TAG_VALUE_CONTAINS、タグ伝播のマージ(ON_CONFLICT = MERGE)、マスキングポリシーとの関係までを検証します。
【追記】
Snowflake Community Awards の「RISING COMMUNITY LEADER OF THE YEAR」部門・APJ枠のファイナリストに選ばれました。
詳細は下記よりご確認ください。
マルチバリュータグの概要
これまでのタグは、1つのオブジェクトに対して1つの値しか持てませんでした。複数の分類を表現するにはタグを分ける、値を連結するといった回避策が必要でした。
マルチバリュータグは MULTI_VALUE = TRUE を指定したタグで、同じオブジェクト・カラムに複数の値を割り当てられます。
単一値タグとの違いは次のとおりです。
| 項目 | 単一値タグ | マルチバリュータグ |
|---|---|---|
| 値の数 | 1つのタグにつき1オブジェクト(またはカラム)に1値 | 同じタグに複数値(オブジェクトあたりデフォルト上限10値) |
| タグ定義 | MULTI_VALUE を省略して作成 |
MULTI_VALUE = TRUE を指定(既存タグの変換も可) |
| 値の割り当て | SET TAG / UNSET TAG |
ADD VALUE / DROP VALUE(SET TAG は全値を置換) |
| 値の確認 | SYSTEM$GET_TAG |
SYSTEM$TAG_VALUE_CONTAINS |
| 伝播の競合解決 | 単一の勝者を選ぶ戦略のみ | ON_CONFLICT = MERGE で複数値をマージできる |
ON_CONFLICT = MERGE はマルチバリュータグ専用の競合解決戦略です。タグ伝播で複数の上流から異なる値が届いたとき、1つに絞らず全値を下流に引き継げます。
前提条件
- タグの作成・設定自体は全エディションで利用可能
- 本記事で扱うタグ伝播(
PROPAGATE/ON_CONFLICT)とタグベースマスキングポリシーは Enterprise Edition 以上 - タグの作成: スキーマへの
CREATE TAG権限 - タグの割り当て: アカウントの
APPLY TAG権限、または対象タグへのAPPLY権限と対象オブジェクトの所有権
検証は2026年8月27日に AWS 東京リージョンのアカウントで、ACCOUNTADMIN で実施しています。
事前準備
検証用の DB と、基本操作用(CUSTOMERS)・カラム操作用(ORDERS)・タグ伝播用(SALES_DATA / SUPPORT_DATA)のテーブルを作成します。
事前準備
USE ROLE ACCOUNTADMIN;
CREATE OR REPLACE DATABASE MVT_TEST_DB;
CREATE SCHEMA MVT_TEST_DB.GOVERNANCE;
CREATE SCHEMA MVT_TEST_DB.SALES;
-- テーブルレベル検証用
CREATE OR REPLACE TABLE MVT_TEST_DB.SALES.CUSTOMERS AS
SELECT
SEQ4() + 1 AS CUSTOMER_ID,
'user' || TO_VARCHAR(SEQ4() + 1) || '@example.com' AS EMAIL,
'090-0000-' || LPAD(TO_VARCHAR(SEQ4() + 1), 4, '0') AS PHONE
FROM TABLE(GENERATOR(ROWCOUNT => 10));
-- カラムレベル・マスキングポリシー検証用
CREATE OR REPLACE TABLE MVT_TEST_DB.SALES.ORDERS AS
SELECT
SEQ4() + 1 AS ORDER_ID,
'user' || TO_VARCHAR(SEQ4() + 1) || '@example.com' AS CUSTOMER_EMAIL,
UNIFORM(1000, 100000, RANDOM()) AS AMOUNT
FROM TABLE(GENERATOR(ROWCOUNT => 10));
-- タグ伝播検証用
CREATE OR REPLACE TABLE MVT_TEST_DB.SALES.SALES_DATA AS
SELECT SEQ4() + 1 AS ID, 'sales_note_' || TO_VARCHAR(SEQ4() + 1) AS SALES_NOTE
FROM TABLE(GENERATOR(ROWCOUNT => 10));
CREATE OR REPLACE TABLE MVT_TEST_DB.SALES.SUPPORT_DATA AS
SELECT SEQ4() + 1 AS ID, 'support_note_' || TO_VARCHAR(SEQ4() + 1) AS SUPPORT_NOTE
FROM TABLE(GENERATOR(ROWCOUNT => 10));
試してみた
MULTI_VALUE = TRUE でタグを作成する
CREATE TAG に MULTI_VALUE = TRUE を付けるだけです。
CREATE OR REPLACE TAG MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG MULTI_VALUE = TRUE
COMMENT = 'Multi-value classification tag';
SHOW TAGS IN SCHEMA MVT_TEST_DB.GOVERNANCE;
SHOW TAGS の出力には multi_value カラムが追加されており、true と表示されます。GET_DDL の結果にも MULTI_VALUE = TRUE が含まれます。

ADD VALUE / DROP VALUE で値を追加・削除する
値の操作は SET TAG ではなく ADD VALUE / DROP VALUE を使います。1つ目の値も ADD VALUE で追加できます。
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS
ADD VALUE 'PII' FOR TAG MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG;
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS
ADD VALUE 'FINANCIAL' FOR TAG MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG;
TAG_REFERENCES で確認すると、値ごとに1行で返ります。
SELECT TAG_NAME, TAG_VALUE
FROM TABLE(MVT_TEST_DB.INFORMATION_SCHEMA.TAG_REFERENCES('MVT_TEST_DB.SALES.CUSTOMERS', 'TABLE'));

細かい挙動も確認しましたが、いずれもエラーとなりませんでした。
- 重複した値の
ADD VALUEは値が増えない - 存在しない値の
DROP VALUEも何も起きない - 全値を
DROP VALUEすると、タグの割り当て自体が外れる
カラムレベルは MODIFY COLUMN で操作します。複数カラムの同時操作もできます。
ALTER TABLE MVT_TEST_DB.SALES.ORDERS MODIFY COLUMN CUSTOMER_EMAIL
ADD VALUE 'email_pii' FOR TAG MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG;
ALTER TABLE MVT_TEST_DB.SALES.ORDERS MODIFY COLUMN CUSTOMER_EMAIL
ADD VALUE 'contact_info' FOR TAG MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG;
-- 複数カラムを1文で操作
ALTER TABLE MVT_TEST_DB.SALES.ORDERS MODIFY
COLUMN ORDER_ID ADD VALUE 'id_field' FOR TAG MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG,
COLUMN AMOUNT ADD VALUE 'financial_data' FOR TAG MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG;

SYSTEM$TAG_VALUE_CONTAINS で値の有無を確認する
マルチバリュータグの値の確認には、新しいシステム関数 SYSTEM$TAG_VALUE_CONTAINS を使います。指定した値が割り当てられていれば TRUE、なければ FALSE を返します。
単一値タグにも使えますが、複数値が設定されていてもエラーにならない点が SYSTEM$GET_TAG との大きな違いです。
-- 割り当て済みの値
SELECT SYSTEM$TAG_VALUE_CONTAINS(
'MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG', 'MVT_TEST_DB.SALES.CUSTOMERS', 'TABLE', 'PII');
-- 未割り当ての値
SELECT SYSTEM$TAG_VALUE_CONTAINS(
'MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG', 'MVT_TEST_DB.SALES.CUSTOMERS', 'TABLE', 'HIPAA');
-- 値の比較は大文字小文字を区別する
SELECT SYSTEM$TAG_VALUE_CONTAINS(
'MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG', 'MVT_TEST_DB.SALES.CUSTOMERS', 'TABLE', 'pii');
-- カラムは <テーブル>.<カラム> 形式・ドメインは COLUMN
SELECT SYSTEM$TAG_VALUE_CONTAINS(
'MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG', 'MVT_TEST_DB.SALES.ORDERS.CUSTOMER_EMAIL', 'COLUMN', 'email_pii');
-- タグ未割り当てのオブジェクトでもエラーにならない
SELECT SYSTEM$TAG_VALUE_CONTAINS(
'MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG', 'MVT_TEST_DB.SALES.SALES_DATA', 'TABLE', 'PII');

SYSTEM$GET_TAG は複数値が割り当てられているとエラーになる
従来の SYSTEM$GET_TAG を複数値のタグに使うとエラーになります。
-- CLASSIFICATION_TAG は2値('PII', 'FINANCIAL')の状態
SELECT SYSTEM$GET_TAG('MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG', 'MVT_TEST_DB.SALES.CUSTOMERS', 'TABLE');

一方、マルチバリュータグでも値が1つだけなら SYSTEM$GET_TAG は正常に値を返しました。
エラーになるかはタグの定義ではなく「現在割り当てられている値の数」で決まります。
SYSTEM$GET_TAG に依存する既存の運用スクリプトがある場合、2つ目の値を追加した瞬間に動かなくなります。マルチバリュー化したタグの参照は SYSTEM$TAG_VALUE_CONTAINS に揃えるのが安全です。
既存タグの変換は簡単、ただし逆戻りは不可
単一値タグに ADD VALUE するとエラーになります。既存タグをマルチバリュー化するには ALTER TAG で変換します。
CREATE OR REPLACE TAG MVT_TEST_DB.GOVERNANCE.SENSITIVITY_TAG;
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS
SET TAG MVT_TEST_DB.GOVERNANCE.SENSITIVITY_TAG = 'HIGH';
-- SENSITIVITY_TAG は単一値タグとして作成し、値 'HIGH' を設定済み
ALTER TAG MVT_TEST_DB.GOVERNANCE.SENSITIVITY_TAG SET MULTI_VALUE = TRUE;
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS
ADD VALUE 'MEDIUM' FOR TAG MVT_TEST_DB.GOVERNANCE.SENSITIVITY_TAG;

変換後も既存の値 'HIGH' は保持され、'MEDIUM' を追加すると2値になりました。
逆方向の変換はエラーになります。
ALTER TAG MVT_TEST_DB.GOVERNANCE.SENSITIVITY_TAG SET MULTI_VALUE = FALSE;

CREATE TAG ... MULTI_VALUE = FALSE の明示指定も同じエラーになりました。単一値タグは「MULTI_VALUE を省略して作る」一択で、一度マルチバリュー化したら戻せません。
SET TAG は全値を置き換える
マルチバリュータグにも従来の SET TAG 構文は使えますが、追記ではなく全置換です。
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS
ADD VALUE 'FINANCIAL' FOR TAG MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG;
-- 'FINANCIAL', 'PII' の2値の状態から実行
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS
SET TAG MVT_TEST_DB.GOVERNANCE.CLASSIFICATION_TAG = 'GDPR';

実行後の値は 'GDPR' の1つだけに置き換わりました。
値を積み増したい場面で誤って SET TAG を使うと、それまでの設定がなくなります。
ON_CONFLICT = MERGE: ビューが複数ソースの値をマージして受け取る
タグ伝播と組み合わせます。ON_CONFLICT = MERGE はマルチバリュータグ専用で、単一値タグに指定するとエラーになります。
CREATE OR REPLACE TAG MVT_TEST_DB.GOVERNANCE.DATA_SOURCE_TAG
MULTI_VALUE = TRUE
PROPAGATE = ON_DEPENDENCY_AND_DATA_MOVEMENT
ON_CONFLICT = MERGE;
-- 2つのソーステーブルに別々の値を設定
ALTER TABLE MVT_TEST_DB.SALES.SALES_DATA
SET TAG MVT_TEST_DB.GOVERNANCE.DATA_SOURCE_TAG = 'sales_system';
ALTER TABLE MVT_TEST_DB.SALES.SUPPORT_DATA
SET TAG MVT_TEST_DB.GOVERNANCE.DATA_SOURCE_TAG = 'support_system';
-- 両テーブルを JOIN したビューを作成
CREATE OR REPLACE VIEW MVT_TEST_DB.SALES.V_COMBINED AS
SELECT s.ID, s.SALES_NOTE, t.SUPPORT_NOTE
FROM MVT_TEST_DB.SALES.SALES_DATA s
JOIN MVT_TEST_DB.SALES.SUPPORT_DATA t ON s.ID = t.ID;
SELECT
SYSTEM$TAG_VALUE_CONTAINS('MVT_TEST_DB.GOVERNANCE.DATA_SOURCE_TAG',
'MVT_TEST_DB.SALES.V_COMBINED', 'TABLE', 'sales_system') AS FROM_SALES, -- True
SYSTEM$TAG_VALUE_CONTAINS('MVT_TEST_DB.GOVERNANCE.DATA_SOURCE_TAG',
'MVT_TEST_DB.SALES.V_COMBINED', 'TABLE', 'support_system') AS FROM_SUPPORT; -- True

ビュー作成直後の確認で、両ソースの値がどちらも TRUE でした。
単一値タグの伝播では競合時にどちらか1つに解決されますが、MERGE なら「このビューは sales と support の両方に由来する」という情報を失わずに持てます。
TAG_REFERENCES には APPLY_METHOD カラムがあり、伝播で付いた値は PROPAGATED と表示されます。手動付与(MANUAL)と区別できます。
SELECT TAG_NAME, TAG_VALUE, LEVEL, APPLY_METHOD
FROM TABLE(MVT_TEST_DB.INFORMATION_SCHEMA.TAG_REFERENCES('MVT_TEST_DB.SALES.V_COMBINED', 'TABLE'));

10値を超えるとエラー
値の上限はオブジェクトあたり10値(デフォルト)です。11個目の ADD VALUE で上限のエラーになりました。
-- V01〜V10 の10値を追加済みの状態で実行
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS ADD VALUE 'V11' FOR TAG MVT_TEST_DB.GOVERNANCE.LIMIT_TAG;

マスキングポリシー: タグ値を参照するポリシーは2値目でクエリごと失敗する
タグ値でマスク挙動を分岐させる SYSTEM$GET_TAG_ON_CURRENT_COLUMN は、複数値に非対応です。実際にどうなるか確認しました。
CREATE OR REPLACE TAG MVT_TEST_DB.GOVERNANCE.MASK_TEST_TAG MULTI_VALUE = TRUE;
CREATE OR REPLACE MASKING POLICY MVT_TEST_DB.GOVERNANCE.EMAIL_MASK AS (VAL VARCHAR) RETURNS VARCHAR ->
CASE WHEN SYSTEM$GET_TAG_ON_CURRENT_COLUMN('MVT_TEST_DB.GOVERNANCE.MASK_TEST_TAG') = 'PUBLIC'
THEN VAL
ELSE '*** MASKED ***'
END;
ALTER TABLE MVT_TEST_DB.SALES.ORDERS MODIFY COLUMN CUSTOMER_EMAIL
SET MASKING POLICY MVT_TEST_DB.GOVERNANCE.EMAIL_MASK;
-- 値1つ('PUBLIC')の状態では正常に評価され、素値が返る
ALTER TABLE MVT_TEST_DB.SALES.ORDERS MODIFY COLUMN CUSTOMER_EMAIL
ADD VALUE 'PUBLIC' FOR TAG MVT_TEST_DB.GOVERNANCE.MASK_TEST_TAG;
SELECT CUSTOMER_EMAIL FROM MVT_TEST_DB.SALES.ORDERS LIMIT 3; -- 成功

-- 値を2つにすると SELECT 自体が失敗する
ALTER TABLE MVT_TEST_DB.SALES.ORDERS MODIFY COLUMN CUSTOMER_EMAIL
ADD VALUE 'PII' FOR TAG MVT_TEST_DB.GOVERNANCE.MASK_TEST_TAG;
SELECT CUSTOMER_EMAIL FROM MVT_TEST_DB.SALES.ORDERS LIMIT 3; -- エラー

注意: マスク結果が変わるのではなく、対象カラムを参照するクエリ全体が実行時エラーになります。ポリシー条件で参照しているタグに2つ目の値を追加すると、そのカラムを使う全ユーザーのクエリが止まります。公式ドキュメントのとおり、ポリシー条件に使うタグは単一値のまま分離してください。
ALLOWED_VALUES と併用できる
マルチバリュータグと ALLOWED_VALUES の併用は、ドキュメントに明記がありませんが動作しました。
CREATE OR REPLACE TAG MVT_TEST_DB.GOVERNANCE.AV_TAG
ALLOWED_VALUES 'PII', 'FINANCIAL', 'GDPR'
MULTI_VALUE = TRUE;
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS ADD VALUE 'PII' FOR TAG MVT_TEST_DB.GOVERNANCE.AV_TAG; -- 成功
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS ADD VALUE 'GDPR' FOR TAG MVT_TEST_DB.GOVERNANCE.AV_TAG; -- 成功
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS ADD VALUE 'NOT_ALLOWED' FOR TAG MVT_TEST_DB.GOVERNANCE.AV_TAG; -- エラー


ADD VALUE にも ALLOWED_VALUES の制約が効き、許可外の値は拒否されます。分類の語彙を固定したまま複数値を許す、という使い方ができます。
なお MULTI_VALUE = TRUE を ALLOWED_VALUES より先に書くと構文エラーになりました。公式ドキュメントにも「ALLOWED_VALUES は他のパラメータより前に指定する」と記載があります。
一方、後述のタグ伝播で使う ON_CONFLICT = MERGE との併用は、本検証環境ではエラーで拒否されました。CREATE TAG の構文上は指定できるため、挙動が変わる可能性があります。
ユースケース: 複数の規制対象をまとめて棚卸しする
機能検証の仕上げに、コンプライアンス管理での使い方を試します。
単一値タグで複数の規制を扱うと、規制の数だけタグが増えていきます。
マルチバリュータグなら1つの COMPLIANCE_TAG に集約でき、MERGE 伝播と組み合わせると下流の加工結果も自動で棚卸しの対象に載ります。
シナリオとして、次の3つを規制対象として分類します。
1つのオブジェクトが複数の規制に同時に該当する点がポイントです。
- 顧客テーブル(CUSTOMERS): メールアドレスや電話番号などの個人情報を含むため、個人情報保護法(APPI)と GDPR の対象とする
- 決済テーブル(PAYMENTS): カード番号を含むため PCI DSS の対象。顧客の情報でもあるため APPI の対象ともする
- 注文テーブル(ORDERS): メールアドレスカラムだけを、カラム単位で APPI と GDPR の対象とする
構成の全体像は次のとおりです。手動でタグ付けするのはソース側だけで、下流ビューには伝播で自動的に付与されます。
-- 規制分類タグ(ALLOWED_VALUES は MERGE と併用するとエラーになるため未使用)
CREATE OR REPLACE TAG MVT_TEST_DB.GOVERNANCE.COMPLIANCE_TAG
MULTI_VALUE = TRUE
PROPAGATE = ON_DEPENDENCY_AND_DATA_MOVEMENT
ON_CONFLICT = MERGE;
-- 決済テーブルを追加
CREATE OR REPLACE TABLE MVT_TEST_DB.SALES.PAYMENTS AS
SELECT
SEQ4() + 1 AS PAYMENT_ID,
'4111-1111-1111-' || LPAD(TO_VARCHAR(SEQ4() + 1), 4, '0') AS CARD_NUMBER,
UNIFORM(1000, 100000, RANDOM()) AS AMOUNT
FROM TABLE(GENERATOR(ROWCOUNT => 10));
-- 各テーブル・カラムに該当する規制を付与
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS ADD VALUE 'APPI' FOR TAG MVT_TEST_DB.GOVERNANCE.COMPLIANCE_TAG;
ALTER TABLE MVT_TEST_DB.SALES.CUSTOMERS ADD VALUE 'GDPR' FOR TAG MVT_TEST_DB.GOVERNANCE.COMPLIANCE_TAG;
ALTER TABLE MVT_TEST_DB.SALES.PAYMENTS ADD VALUE 'PCI_DSS' FOR TAG MVT_TEST_DB.GOVERNANCE.COMPLIANCE_TAG;
ALTER TABLE MVT_TEST_DB.SALES.PAYMENTS ADD VALUE 'APPI' FOR TAG MVT_TEST_DB.GOVERNANCE.COMPLIANCE_TAG;
ALTER TABLE MVT_TEST_DB.SALES.ORDERS MODIFY COLUMN CUSTOMER_EMAIL
ADD VALUE 'APPI' FOR TAG MVT_TEST_DB.GOVERNANCE.COMPLIANCE_TAG;
ALTER TABLE MVT_TEST_DB.SALES.ORDERS MODIFY COLUMN CUSTOMER_EMAIL
ADD VALUE 'GDPR' FOR TAG MVT_TEST_DB.GOVERNANCE.COMPLIANCE_TAG;
顧客と決済を掛け合わせた下流ビューを作り、タグの状態を確認します。
CREATE OR REPLACE VIEW MVT_TEST_DB.SALES.V_CUSTOMER_PAYMENTS AS
SELECT c.CUSTOMER_ID, c.EMAIL, p.PAYMENT_ID, p.AMOUNT
FROM MVT_TEST_DB.SALES.CUSTOMERS c
JOIN MVT_TEST_DB.SALES.PAYMENTS p ON c.CUSTOMER_ID = p.PAYMENT_ID;
SELECT TAG_NAME, TAG_VALUE, APPLY_METHOD
FROM TABLE(MVT_TEST_DB.INFORMATION_SCHEMA.TAG_REFERENCES('MVT_TEST_DB.SALES.V_CUSTOMER_PAYMENTS', 'TABLE'))
WHERE TAG_NAME = 'COMPLIANCE_TAG'
ORDER BY TAG_VALUE;

顧客(APPI・GDPR)と決済(PCI_DSS・APPI)を掛け合わせたビューが、下流への追加の手動分類なしで3つの規制すべての対象となりました。単一値タグの伝播では競合でどれか1つに絞られてしまう情報です。
アカウント全体の棚卸しには SNOWFLAKE.ACCOUNT_USAGE.TAG_REFERENCES ビューを使います(反映まで最大2時間の遅延あり)。複数値は値ごとに1行で返り、伝播で付いたビューの分も含まれます。
SELECT OBJECT_NAME, COLUMN_NAME, DOMAIN, TAG_VALUE
FROM SNOWFLAKE.ACCOUNT_USAGE.TAG_REFERENCES
WHERE TAG_NAME = 'COMPLIANCE_TAG' AND OBJECT_DELETED IS NULL
ORDER BY OBJECT_NAME, TAG_VALUE;

WHERE TAG_VALUE = 'GDPR' で規制別の一覧に、GROUP BY TAG_VALUE で規制ごとのサマリになります。
SELECT TAG_VALUE AS REGULATION, COUNT(*) AS TARGET_COUNT
FROM SNOWFLAKE.ACCOUNT_USAGE.TAG_REFERENCES
WHERE TAG_NAME = 'COMPLIANCE_TAG' AND OBJECT_DELETED IS NULL
GROUP BY TAG_VALUE
ORDER BY TAG_VALUE;

個別オブジェクトの確認は、ここまで使ってきた INFORMATION_SCHEMA.TAG_REFERENCES と SYSTEM$TAG_VALUE_CONTAINS が遅延なしで使えます。定常的な棚卸しレポートは ACCOUNT_USAGE 側、監査スクリプトでのピンポイント確認はシステム関数、という使い分けになります。
制限事項・注意点
2026年8月27日時点の検証結果と公式ドキュメントから、導入時に気を付けたい点をまとめます。
制限事項・注意点
- 一度
MULTI_VALUE = TRUEにしたタグは単一値タグに戻せない。 - 値の上限はオブジェクトあたり10値(デフォルト)。11個目はエラー
SYSTEM$GET_TAG/SYSTEM$GET_TAG_ON_CURRENT_TABLE/SYSTEM$GET_TAG_ON_CURRENT_COLUMNは複数値でエラー。値が1つの間は動くため、2つ目の値の追加が既存コードを壊す点に注意SET TAGは追記ではなく全値の置換。UNSET TAGと全値のDROP VALUEはどちらもタグの割り当てを外す- 重複値の
ADD VALUE・存在しない値のDROP VALUEはエラーにならない ON_CONFLICT = MERGEはマルチバリュータグ専用。単一値タグに指定するとエラーALLOWED_VALUESとの併用は可能でADD VALUEにも制約が効く。ただしON_CONFLICT = MERGEとの併用はエラーになった(本検証環境の実測。ドキュメントに記載なし)SYSTEM$TAG_VALUE_CONTAINSの値の比較は大文字小文字を区別する
最後に
複数の分類が同時に当てはまるケースを1つのタグで表現でき、ON_CONFLICT = MERGE と組み合わせるとデータの由来を失わずに下流へ引き継げるのが便利だと感じました。
一方で SYSTEM$GET_TAG 系やポリシー条件との相性には注意が必要で、ポリシー用のタグは単一値のまま分けるのが安全です。
この記事が何かの参考になれば幸いです!





