[新機能]Snowflake のMulti-value tagsが GA になったので複数値の管理からタグ伝播のマージまで試してみた

[新機能]Snowflake のMulti-value tagsが GA になったので複数値の管理からタグ伝播のマージまで試してみた

Snowflake の新機能「マルチバリュータグ」が 2026年8月に GA となりました。1つのタグに複数の値を割り当てられる仕様を、実際の操作や MERGE 伝播、マスキングポリシーとの連携まで詳しく検証します。
2026.08.29

かわばたです。

2026年8月25日にマルチバリュータグ が一般提供(GA)となりました。
1つのタグに複数の値を割り当てられます。「このテーブルは営業システムと会計システムの両方のデータから作られている」「このカラムは個人情報でもあり決済情報でもある」のように、複数の分類が同時に当てはまるケースをタグで表現できます。

本記事では、値の追加・削除から確認用関数 SYSTEM$TAG_VALUE_CONTAINS、タグ伝播のマージ(ON_CONFLICT = MERGE)、マスキングポリシーとの関係までを検証します。

https://docs.snowflake.com/en/user-guide/object-tagging/multi-value-tags

【追記】
Snowflake Community Awards の「RISING COMMUNITY LEADER OF THE YEAR」部門・APJ枠のファイナリストに選ばれました。
詳細は下記よりご確認ください。

https://dev.classmethod.jp/articles/snowflake-community-awards-finalist-activities-review/

マルチバリュータグの概要

これまでのタグは、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 TAGMULTI_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 が含まれます。

2026-08-27_16h23_34

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'));

2026-08-27_16h24_42

細かい挙動も確認しましたが、いずれもエラーとなりませんでした。

  • 重複した値の 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;

2026-08-27_16h29_20

SYSTEM$TAG_VALUE_CONTAINS で値の有無を確認する

マルチバリュータグの値の確認には、新しいシステム関数 SYSTEM$TAG_VALUE_CONTAINS を使います。指定した値が割り当てられていれば TRUE、なければ FALSE を返します。
単一値タグにも使えますが、複数値が設定されていてもエラーにならない点が SYSTEM$GET_TAG との大きな違いです。

https://docs.snowflake.com/en/sql-reference/functions/system_tag_value_contains

-- 割り当て済みの値
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');  

2026-08-28_08h07_10

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');

2026-08-28_08h15_00

一方、マルチバリュータグでも値が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;

2026-08-28_16h27_51

変換後も既存の値 'HIGH' は保持され、'MEDIUM' を追加すると2値になりました。
逆方向の変換はエラーになります。

ALTER TAG MVT_TEST_DB.GOVERNANCE.SENSITIVITY_TAG SET MULTI_VALUE = FALSE;

2026-08-28_16h28_30

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';

2026-08-28_16h30_02

実行後の値は '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

2026-08-28_16h38_39

ビュー作成直後の確認で、両ソースの値がどちらも 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'));

2026-08-28_16h40_34

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;

2026-08-28_16h44_25

マスキングポリシー: タグ値を参照するポリシーは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;  -- 成功

2026-08-28_16h47_44


-- 値を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;  -- エラー

2026-08-28_16h48_26

注意: マスク結果が変わるのではなく、対象カラムを参照するクエリ全体が実行時エラーになります。ポリシー条件で参照しているタグに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;  -- エラー

2026-08-28_17h11_04

2026-08-28_17h12_40
ADD VALUE にも ALLOWED_VALUES の制約が効き、許可外の値は拒否されます。分類の語彙を固定したまま複数値を許す、という使い方ができます。
なお MULTI_VALUE = TRUEALLOWED_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;

2026-08-29_22h40_49

顧客(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;

2026-08-29_22h46_01

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;

2026-08-29_22h48_19

個別オブジェクトの確認は、ここまで使ってきた INFORMATION_SCHEMA.TAG_REFERENCESSYSTEM$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 系やポリシー条件との相性には注意が必要で、ポリシー用のタグは単一値のまま分けるのが安全です。

この記事が何かの参考になれば幸いです!


Snowflake World Tour Tokyo 2026に参加しませんか?

Snowflakeの国内最大級イベント「Snowflake World Tour Tokyo」が2026年9月10日(木)・11日(金)にグランドプリンスホテル新高輪にて開催されます。
最新のAI・データ活用事例やライブデモを体感できる無料イベントです。

Snowflake World Tour Tokyoイベントに参加する


Snowflake Community Awards ファイナリストに選出されました

DevelopersIO で Snowflake 記事を執筆している かわばた が、Snowflake Community Awards「RISING COMMUNITY LEADER OF THE YEAR」部門・APJ枠のファイナリストに選ばれました。
最終選考の30%はコミュニティ投票です。記事がお役に立っていたようでしたら、9月15日(火)までにぜひ一票お願いします。フォームの「(4 of 6) RISING COMMUNITY LEADER OF THE YEAR」で Tomohiro Kawabata | Classmethod, Japan を選択、2分ほどで完了します。

投票フォームを開く


Snowflakeの導入支援はクラスメソッドに!

クラスメソッドでは Snowflake の導入を支援しております。
製品の詳細や支援の内容についてお気軽にお問い合わせください。

Snowflakeの詳細を見る

この記事をシェアする

関連記事