
Snowflake におけるタグの概要と特徴をまとめてみる
はじめに
Snowflake のタグについて基本的なことをまとめておきたく記事としました。
注意点として、本記事の内容は2025年3月15日時点のものです。また、タグとオブジェクトへのタグ付けについて主に扱うのでタグに関連する機能(タグベースのマスキングポリシー など)についてはここでは扱いません。
タグの概要
Snowflake におけるタグは、別のオブジェクトに割り当てることができるスキーマレベルのオブジェクトです。タグをオブジェクトに割り当てる際に、文字列値を指定することで、タグの名称とその文字列値をキーと値のペアとして設定できます。割り当て時の特徴は以下です。
- あるタグを同時に異なるオブジェクトに設定できる
- あるオブジェクトに複数のタグを設定することもできる
- 1 つのオブジェクトに設定できる一意のタグの最大数は 50
アクセス制御
タグに関する基本的な権限は以下です。
- スキーマ レベルの CREATE TAG 権限
以下で権限付与可能です
GRANT CREATE TAG ON SCHEMA <db>.<schema> TO ROLE <ロール名>;
- アカウント レベルの APPLY TAG 権限
タグの付与対象のオブジェクト(テーブルなど)に関する直接的な権限がなくてもタグを設定/解除できる権限。以下でカスタムロールに付与できます。
GRANT APPLY TAG ON ACCOUNT TO ROLE <ロール名>;
- タグ レベルの APPLY TAG 権限
特定のタグをオブジェクトに設定/解除できる権限。対象のオブジェクト(テーブルなど)の所有権が別に必要です。
GRANT USAGE ON DATABASE <データベース> TO ROLE <ロール名>;
GRANT USAGE ON SCHEMA <データベース.スキーマ> TO ROLE <ロール名>;
GRANT APPLY ON TAG <データベース.スキーマ.タグ> TO ROLE <ロール名>;
タグの操作には前提としてその親データベース、スキーマの操作権限が必要です。
事前準備
検証用の環境を以下のコマンドで用意しました。このコマンドの作成には生成AIを使用しています。
環境用意
-- SYSADMIN で実行
USE ROLE SYSADMIN;
-- データベースの作成
CREATE DATABASE raw_db;
CREATE DATABASE stg_db;
CREATE DATABASE mart_db;
-- raw_db のスキーマ作成
CREATE SCHEMA raw_db.shop_schema;
CREATE SCHEMA raw_db.customer_schema;
-- stg_db のスキーマ作成
CREATE SCHEMA stg_db.shop_schema;
CREATE SCHEMA stg_db.customer_schema;
-- mart_db のスキーマ作成
CREATE SCHEMA mart_db.analytics;
/*テーブル・ビューの作成ロール*/
USE ROLE USERADMIN;
CREATE ROLE data_editor;
-- 権限付与
USE ROLE SECURITYADMIN;
-- raw_db の各スキーマに CREATE TABLE 権限を付与
GRANT USAGE ON DATABASE raw_db TO ROLE data_editor;
GRANT USAGE ON SCHEMA raw_db.shop_schema TO ROLE data_editor;
GRANT USAGE ON SCHEMA raw_db.customer_schema TO ROLE data_editor;
GRANT CREATE TABLE ON SCHEMA raw_db.shop_schema TO ROLE data_editor;
GRANT CREATE TABLE ON SCHEMA raw_db.customer_schema TO ROLE data_editor;
-- stg_db の各スキーマに CREATE VIEW 権限を付与
GRANT USAGE ON DATABASE stg_db TO ROLE data_editor;
GRANT USAGE ON SCHEMA stg_db.shop_schema TO ROLE data_editor;
GRANT USAGE ON SCHEMA stg_db.customer_schema TO ROLE data_editor;
GRANT CREATE VIEW ON SCHEMA stg_db.shop_schema TO ROLE data_editor;
GRANT CREATE VIEW ON SCHEMA stg_db.customer_schema TO ROLE data_editor;
-- mart_db の各スキーマに CREATE TABLE 権限を付与
GRANT USAGE ON DATABASE mart_db TO ROLE data_editor;
GRANT USAGE ON SCHEMA mart_db.analytics TO ROLE data_editor;
GRANT CREATE TABLE ON SCHEMA mart_db.analytics TO ROLE data_editor;
GRANT ROLE data_editor TO ROLE SYSADMIN;
USE ROLE SECURITYADMIN;
GRANT usage on warehouse compute_wh to role data_editor;
/*テーブル・ビューを作成*/
USE ROLE data_editor;
-- 購買履歴テーブル(raw_db.shop_schema)
CREATE TABLE raw_db.shop_schema.purchase_history (
purchase_id INT AUTOINCREMENT PRIMARY KEY,
customer_id INT,
product_name STRING,
quantity INT,
purchase_date DATE
);
-- サンプルデータ挿入
INSERT INTO raw_db.shop_schema.purchase_history (customer_id, product_name, quantity, purchase_date) VALUES
(1, 'Laptop', 1, '2024-06-01'),
(2, 'Smartphone', 2, '2024-06-02'),
(1, 'Keyboard', 1, '2024-06-03');
-- 顧客テーブル(raw_db.customer_schema)
CREATE TABLE raw_db.customer_schema.customer (
customer_id INT PRIMARY KEY,
customer_name STRING,
email STRING,
registration_date DATE
);
-- サンプルデータ挿入
INSERT INTO raw_db.customer_schema.customer (customer_id, customer_name, email, registration_date) VALUES
(1, 'Alice', 'alice@example.com', '2023-01-15'),
(2, 'Bob', 'bob@example.com', '2023-02-20');
-- 購買履歴ビュー(stg_purchase_history)
CREATE VIEW stg_db.shop_schema.stg_purchase_history AS
SELECT
purchase_id AS id,
customer_id,
product_name AS item_name,
quantity,
purchase_date
FROM raw_db.shop_schema.purchase_history;
-- 顧客ビュー(stg_customer)
CREATE VIEW stg_db.customer_schema.stg_customer AS
SELECT
customer_id AS id,
customer_name AS name,
email,
registration_date
FROM raw_db.customer_schema.customer;
-- 購買履歴と顧客情報を結合し、顧客ごとの購入総数を集計
CREATE TABLE mart_db.analytics.customer_purchase_summary AS
SELECT
c.id AS customer_id,
c.name AS customer_name,
COUNT(p.id) AS total_purchases,
SUM(p.quantity) AS total_items_purchased
FROM stg_db.customer_schema.stg_customer c
LEFT JOIN stg_db.shop_schema.stg_purchase_history p
ON c.id = p.customer_id
GROUP BY c.id, c.name;
コマンド実行後、以下のオブジェクト構成となります。データ加工のレイヤーごとにデータベースを作成しています。
基本操作
タグの管理ロール・管理先データベース スキーマを作成
タグはスキーマレベルのオブジェクトなので、タグの作成先となるデータベース スキーマが必要です。タグの管理は専用のロールでアカウントレベルで行うこととし、以下のコマンド環境を用意しました。
--タグの作成先となるデータベース・スキーマを作成
USE ROLE SYSADMIN;
CREATE OR REPLACE DATABASE tag_db;
CREATE OR REPLACE SCHEMA tag_db.tags;
--タグの管理用ロールを作成
USE ROLE USERADMIN;
CREATE OR REPLACE ROLE tag_admin;
--権限付与
USE ROLE SECURITYADMIN;
GRANT USAGE ON DATABASE TAG_DB TO ROLE tag_admin;
GRANT USAGE ON SCHEMA TAG_DB.TAGS TO ROLE tag_admin;
----スキーマに対するタグの作成権限
GRANT CREATE TAG ON SCHEMA TAG_DB.TAGS TO ROLE tag_admin;
--アカウントレベルのタグ適用権限
USE ROLE ACCOUNTADMIN;
GRANT APPLY TAG ON ACCOUNT TO ROLE tag_admin;
--権限を確認
>SHOW GRANTS TO ROLE tag_admin;
+-------------------------------+------------+------------+--------------------------+------------+--------------+--------------+--------------+
| created_on | privilege | granted_on | name | granted_to | grantee_name | grant_option | granted_by |
|-------------------------------+------------+------------+--------------------------+------------+--------------+--------------+--------------|
| 2025-03-13 23:16:29.823 -0700 | APPLY TAG | ACCOUNT | <アカウント> | ROLE | TAG_ADMIN | false | ACCOUNTADMIN |
| 2025-03-13 23:16:22.560 -0700 | USAGE | DATABASE | TAG_DB | ROLE | TAG_ADMIN | false | SYSADMIN |
| 2025-03-13 23:16:23.311 -0700 | CREATE TAG | SCHEMA | TAG_DB.TAGS | ROLE | TAG_ADMIN | false | SYSADMIN |
| 2025-03-13 23:16:22.985 -0700 | USAGE | SCHEMA | TAG_DB.TAGS | ROLE | TAG_ADMIN | false | SYSADMIN |
+-------------------------------+------------+------------+--------------------------+------------+--------------+--------------+--------------+
タグの基本操作
- タグの作成
ALLOWED_VALUES
を指定することで、タグ割り当て時に設定できる値を予め限定できます。ここでは個人情報のカテゴリ、内容を表すタグとして作成しました。
--タグを作成
USE ROLE tag_admin;
USE SCHEMA tag_db.tags;
----ALLOWED_VALUESのデフォルトはNULL(空の文字列値(つまり ' ')を含むすべての文字列値が許可されます)。
CREATE OR REPLACE TAG pii_category
ALLOWED_VALUES 'PII-DATA', 'QUASI-PII-DATA'
COMMENT='pii category tag';
CREATE OR REPLACE TAG pii_data
ALLOWED_VALUES 'Names','Address';
--タグを確認
>SHOW TAGS;
+-------------------------------+--------------+---------------+-------------+-----------+------------------+-------------------------------+-----------------+-----------+
| created_on | name | database_name | schema_name | owner | comment | allowed_values | owner_role_type | propagate |
|-------------------------------+--------------+---------------+-------------+-----------+------------------+-------------------------------+-----------------+-----------|
| 2025-03-13 23:20:22.124 -0700 | PII_CATEGORY | TAG_DB | TAGS | TAG_ADMIN | pii category tag | ["PII-DATA","QUASI-PII-DATA"] | ROLE | NULL |
| 2025-03-13 23:46:26.347 -0700 | PII_DATA | TAG_DB | TAGS | TAG_ADMIN | | ["Names","Address"] | ROLE | NULL |
+-------------------------------+--------------+---------------+-------------+-----------+------------------+-------------------------------+-----------------+-----------+
- タグをオブジェクトに割り当て
ソースシステムからロードしたデータを想定したraw_db.customer_schema.customer
テーブルに対してpii_category
タグを割り当ててみます。割り当て時に値も設定します。
--タグの割り当てロールに切り替え
USE ROLE tag_admin;
--テーブルにタグを割り当て
ALTER TABLE raw_db.customer_schema.customer SET TAG tag_db.tags.pii_category = 'PII-DATA';
上記よりtag_admin
にはテーブルへの参照権限を与えていませんがアカウントレベルの APPLY TAG 権限によりテーブルにタグを設定することが可能です。
- 設定したタグを確認
設定したタグは以下のコマンドで確認できます。
--オブジェクト起点
>SELECT SYSTEM$GET_TAG('tag_db.tags.pii_category', 'raw_db.customer_schema.customer', 'table');
+----------------------------------------------------------------------------------------+
| SYSTEM$GET_TAG('TAG_DB.TAGS.PII_CATEGORY', 'RAW_DB.CUSTOMER_SCHEMA.CUSTOMER', 'TABLE') |
|----------------------------------------------------------------------------------------|
| PII-DATA |
+----------------------------------------------------------------------------------------+
--タグ値、タグが格納されているDBスキーマもわかる
USE ROLE SYSADMIN;
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.customer', 'table')
);
+--------------+------------+--------------+-----------+-------+-----------------+-----------------+-------------+--------+-------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------------+-----------+-------+-----------------+-----------------+-------------+--------+-------------+--------------|
| TAG_DB | TAGS | PII_CATEGORY | PII-DATA | TABLE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | TABLE | NULL | NULL |
+--------------+------------+--------------+-----------+-------+-----------------+-----------------+-------------+--------+-------------+--------------+
ACCOUNTUSAGE スキーマ内ではTAG_REFERENCES ビューで確認できます。
USE ROLE ACCOUNTADMIN;
>SELECT * FROM snowflake.account_usage.tag_references
ORDER BY TAG_NAME, DOMAIN, OBJECT_ID;
+--------------+------------+--------+--------------+----------------+-----------------+-----------------+-----------+---------------+----------------+----------+-----------+---------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_ID | TAG_NAME | TAG_VALUE | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_ID | OBJECT_NAME | OBJECT_DELETED | DOMAIN | COLUMN_ID | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------+--------------+----------------+-----------------+-----------------+-----------+---------------+----------------+----------+-----------+---------------+--------------|
| TAG_DB | TAGS | 3 | PII_CATEGORY | PII-DATA | RAW_DB | CUSTOMER_SCHEMA | 19460 | CUSTOMER | NULL | TABLE | NULL | NULL | NULL |
+--------------+------------+--------+--------------+----------------+-----------------+-----------------+-----------+---------------+----------------+----------+-----------+---------------+--------------+
特定のタグの設定権限を与える
部門ごとでタグを管理するなど、特定のタグをオブジェクトに割り当てる権限を持つロールを作成します。
この場合、あわせてタグの割り当て対象となるオブジェクトの所有権も必要なので、ここではテーブル作成ロールであるdata_editor
ロールに、先の手順でタグを設定したテーブルraw_db.customer_schema.customer
のカラムレベルで別のタグを割り当ててみます。
--特定のタグの適用:テーブルの所有者権限が必要なのでここではテーブル作成ロールに特定のタグ付与権限を与える
USE ROLE SECURITYADMIN;
GRANT USAGE ON DATABASE tag_db TO ROLE data_editor;
GRANT USAGE ON SCHEMA tag_db.tags TO ROLE data_editor;
----pii_dataタグの適用権限を与える
GRANT APPLY ON TAG tag_db.tags.pii_data TO ROLE data_editor;
--pii_dataタグの適用権限を持つロールに切り替え
USE ROLE data_editor;
-- 顧客テーブルのcustomer_nameカラムにpii_dataタグを割り当て
ALTER TABLE raw_db.customer_schema.customer MODIFY COLUMN customer_name SET TAG tag_db.tags.pii_data = 'Names';
- 設定したタグを確認
以下でカラム レベルで設定されたタグを確認します。
--オブジェクト起点
>SELECT SYSTEM$GET_TAG('tag_db.tags.pii_data', 'raw_db.customer_schema.customer.customer_name', 'column');
+---------------------------------------------------------------------------------------------------+
| SYSTEM$GET_TAG('TAG_DB.TAGS.PII_DATA', 'RAW_DB.CUSTOMER_SCHEMA.CUSTOMER.CUSTOMER_NAME', 'COLUMN') |
|---------------------------------------------------------------------------------------------------|
| Names |
+---------------------------------------------------------------------------------------------------+
--タグ値、タグが格納されているDBスキーマもわかる
USE ROLE SYSADMIN;
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.customer.customer_name', 'column')
);
+--------------+------------+--------------+-----------+--------+-----------------+-----------------+-------------+--------+---------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------------+-----------+--------+-----------------+-----------------+-------------+--------+---------------+--------------|
| TAG_DB | TAGS | PII_CATEGORY | PII-DATA | TABLE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | PII_DATA | Names | COLUMN | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_NAME | NULL |
+--------------+------------+--------------+-----------+--------+-----------------+-----------------+-------------+--------+---------------+--------------+
注意点として、後述するタグの継承によりこのカラムには2つのタグが設定されていることが確認できます。
タグの特徴
これまでタグの基本操作を見てきたのでここからタグの特徴を試してみます。
継承
Snowflake におけるタグの特徴として、オブジェクト階層に基づきタグも継承されるというものがあります。
例えば、テーブルはデータベースの内部に作成されるので、ここでは階層関係にあります。データベースにタグを設定すると、データベース内に作成されるスキーマやテーブル、テーブルカラムにタグもタグが継承されます。
ここでは以下のタグを新たに作成し、付与レベルにあるオブジェクト階層で割り当て、継承の様子を見てみます。アカウント単位で環境を分離、レイヤーごとにデータベースを作成している設定です。
タグ名 | 付与レベル | 目的 | 値の例 |
---|---|---|---|
environment | アカウント | 環境の区別 | Development , Staging , Production |
layer | データベース | データベースの用途管理 | raw , staging , mart |
上記の設定に基づくタグを作成します。
USE ROLE tag_admin;
USE SCHEMA tag_db.tags;
--アカウントに付与するタグ
CREATE OR REPLACE TAG environment
ALLOWED_VALUES 'dev', 'staging', 'production';
--データベースに付与するタグ
CREATE OR REPLACE TAG layer
ALLOWED_VALUES 'raw', 'staging', 'mart';
>SHOW TAGS;
+-------------------------------+--------------+---------------+-------------+-----------+------------------+-------------------------------+-----------------+-----------+
| created_on | name | database_name | schema_name | owner | comment | allowed_values | owner_role_type | propagate |
|-------------------------------+--------------+---------------+-------------+-----------+------------------+-------------------------------+-----------------+-----------|
| 2025-03-14 00:53:28.633 -0700 | ENVIRONMENT | TAG_DB | TAGS | TAG_ADMIN | | ["dev","staging","prod"] | ROLE | NULL |
| 2025-03-14 00:52:24.089 -0700 | LAYER | TAG_DB | TAGS | TAG_ADMIN | | ["raw","staging","mart"] | ROLE | NULL |
| 2025-03-13 23:20:22.124 -0700 | PII_CATEGORY | TAG_DB | TAGS | TAG_ADMIN | pii category tag | ["PII-DATA","QUASI-PII-DATA"] | ROLE | NULL |
| 2025-03-13 23:46:26.347 -0700 | PII_DATA | TAG_DB | TAGS | TAG_ADMIN | | ["Names","Address"] | ROLE | NULL |
+-------------------------------+--------------+---------------+-------------+-----------+------------------+-------------------------------+-----------------+-----------+
タグを割り当てます。
USE ROLE tag_admin;
--アカウントにタグを設定
ALTER ACCOUNT SET TAG tag_db.tags.environment = 'dev';
--データベースにタグを設定
ALTER DATABASE raw_db SET TAG tag_db.tags.layer = 'raw';
この状態で先の手順でタグを割り当てたテーブルraw_db.customer_schema.customer
に割り当てられたタグを確認すると以下のようになり、アカウント・データベースに割り当てられたタグが自動的に付与されていることが確認できます。
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.customer', 'table')
);
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | TABLE | NULL | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | TABLE | NULL | NULL |
| TAG_DB | TAGS | PII_CATEGORY | PII-DATA | TABLE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | TABLE | NULL | NULL |
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
テーブルカラムレベルで確認すると、さらにカラムに割り当てたタグもあわせて表示されます。
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.customer.customer_name', 'column')
);
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+---------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+---------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | PII_CATEGORY | PII-DATA | TABLE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | PII_DATA | Names | COLUMN | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_NAME | NULL |
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+---------------+--------------+
raw_db
データベース内のスキーマ(customer_schema
)に付与されたタグを確認すると、アカウント・データベースに付与した2つのタグがここでも確認できます。
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema', 'schema')
);
+--------------+------------+-------------+-----------+----------+-----------------+---------------+-----------------+--------+-------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+-------------+-----------+----------+-----------------+---------------+-----------------+--------+-------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | NULL | CUSTOMER_SCHEMA | SCHEMA | NULL | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | NULL | CUSTOMER_SCHEMA | SCHEMA | NULL | NULL |
+--------------+------------+-------------+-----------+----------+-----------------+---------------+-----------------+--------+-------------+--------------+
タグを割り当てたデータベースとは別のデータベース内のスキーマの場合、アカウントに設定したタグのみが継承されていることを確認できます。
>SELECT * FROM TABLE(
stg_db.information_schema.tag_references('stg_db.customer_schema', 'schema')
);
+--------------+------------+-------------+-----------+---------+-----------------+---------------+-----------------+--------+-------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+-------------+-----------+---------+-----------------+---------------+-----------------+--------+-------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | STG_DB | NULL | CUSTOMER_SCHEMA | SCHEMA | NULL | NULL |
+--------------+------------+-------------+-----------+---------+-----------------+---------------+-----------------+--------+-------------+--------------+
継承も含めたタグの付与状況は以下の方法で確認できます。
- Information Schema の TAG_REFERENCES テーブル関数
- Account Usage 内の TAG_REFERENCES_WITH_LINEAGE テーブル関数
オーバーライド
タグの継承とあわせた特徴として、特定のオブジェクトで継承によって付与されたタグがある場合、子オブジェクトでその値をオーバーライドすることができます。
これまでの手順でraw_db.customer_schema.customer
テーブルには以下の通りタグが付与されています。
--customerテーブルのタグを確認
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.customer', 'table')
);
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | TABLE | NULL | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | TABLE | NULL | NULL |
| TAG_DB | TAGS | PII_CATEGORY | PII-DATA | TABLE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | TABLE | NULL | NULL |
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
テーブルの場合、カラムにもタグは継承されるので、テーブルに含まれるcustomer_id
カラムにも直接タグを付与してませんが、同じタグが付与されています。
--customerテーブルのcustomer_idカラムのタグを確認
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.customer.customer_id', 'column')
);
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_ID | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_ID | NULL |
| TAG_DB | TAGS | PII_CATEGORY | PII-DATA | TABLE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_ID | NULL |
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
ここで PII_CATEGORY
タグの値は、テーブルに設定された時と同じPII-DATA
となっているので、カラムレベルで設定値を更新してみます。
USE ROLE tag_admin;
ALTER TABLE raw_db.customer_schema.customer MODIFY COLUMN customer_id SET TAG tag_db.tags.pii_category = 'QUASI-PII-DATA';
この状態で再度customer_id
カラムのタグを確認するとタグPII_CATEGORY
の値が更新されます(継承された値をオーバーライドできました)。
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.customer.customer_id', 'column')
);
+--------------+------------+--------------+----------------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------------+----------------+----------+-----------------+-----------------+-------------+--------+-------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_ID | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_ID | NULL |
| TAG_DB | TAGS | PII_CATEGORY | QUASI-PII-DATA | COLUMN | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER | COLUMN | CUSTOMER_ID | NULL |
+--------------+------------+--------------+----------------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
伝播(Propagation)
一部の処理では、ソースオブジェクトに付与されたタグが宛先(作成先)のオブジェクトに自動的に引継がれます(伝播されます)。
2025年3月14日時点では、以下の操作時にタグが引継がれます。
- CREATE TABLE … LIKE を使用しテーブルを定義した場合
- この場合、ソース テーブルに割り当てられたタグが自動的にターゲット テーブルに割り当てられます
例としてすでにタグを付与済みのraw_db.customer_schema.customer
テーブル定義をコピーします。以下ではあわせて通常の CREATE TABLE でもテーブルを作成しています。
USE ROLE data_editor;
USE SCHEMA raw_db.customer_schema;
----like文でテーブル定義をコピー
CREATE TABLE customer_like LIKE raw_db.customer_schema.customer;
----通常のCREATEテーブル
CREATE TABLE temp (id int);
--カラムレベルでタグを確認
USE ROLE SYSADMIN;
----like文で作成したテーブル
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.customer_like.customer_name', 'column')
);
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+---------------+--------+---------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------------+-----------+----------+-----------------+-----------------+---------------+--------+---------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER_LIKE | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER_LIKE | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | PII_CATEGORY | PII-DATA | TABLE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER_LIKE | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | PII_DATA | Names | COLUMN | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER_LIKE | COLUMN | CUSTOMER_NAME | NULL |
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+---------------+--------+---------------+--------------+
----通常のCREATEテーブル
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.temp.id', 'column')
);
+--------------+------------+-------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+-------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | CUSTOMER_SCHEMA | TEMP | COLUMN | ID | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | CUSTOMER_SCHEMA | TEMP | COLUMN | ID | NULL |
+--------------+------------+-------------+-----------+----------+-----------------+-----------------+-------------+--------+-------------+--------------+
通常の CREATE 文で作成したテーブルは、タグの継承によりアカウント・データベースに付与されたタグが自動的に付与されています。
LIKE 文を使用したテーブルは、あわせてテーブルやテーブルカラムに付与したタグも設定されています。
- クローンによりテーブルを定義した場合
- この場合も、ソース オブジェクト(テーブルなど) 内のタグの関連付けは、複製されたオブジェクトでも維持されます
- ソース オブジェクトがデータベースまたはスキーマの場合
- そのデータベースまたはスキーマに保存されているタグも複製される
- テーブルまたはビューがソース スキーマ/データベースに存在し、同じスキーマまたはデータベース内のタグが設定されている、複製されたテーブルまたはビューは、ソース スキーマまたはデータベース内のタグではなく、(ターゲット スキーマ/データベース内の) 対応する複製されたタグが設定されます
- 参考:Cloning|Snowflake DUCUMENTATION
クローンについても確認してみます。はじめにタグを付与済みのテーブルをクローンし、カラムレベルのタグを確認します。
USE ROLE data_editor;
USE SCHEMA raw_db.customer_schema;
--テーブルをクローン
CREATE TABLE customer_clone CLONE raw_db.customer_schema.customer;
--カラムレベルでタグを確認
USE ROLE SYSADMIN;
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema.customer_clone.customer_name', 'column')
);
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+----------------+--------+---------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+------------+--------------+-----------+----------+-----------------+-----------------+----------------+--------+---------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER_CLONE | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER_CLONE | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | PII_CATEGORY | PII-DATA | TABLE | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER_CLONE | COLUMN | CUSTOMER_NAME | NULL |
| TAG_DB | TAGS | PII_DATA | Names | COLUMN | RAW_DB | CUSTOMER_SCHEMA | CUSTOMER_CLONE | COLUMN | CUSTOMER_NAME | NULL |
+--------------+------------+--------------+-----------+----------+-----------------+-----------------+----------------+--------+---------------+--------------+
この場合、LIKE 文の時と同様にタグが引継がれています。
次に、同じスキーマ内のタグを付与したテーブルがある状態で、スキーマレベルでクローンしてみます。
USE ROLE SYSADMIN;
USE SCHEMA raw_db.customer_schema;
--同じスキーマにタグを作成
CREATE OR REPLACE TAG temp_tag;
--同じスキーマ内のタグを付与
ALTER TABLE raw_db.customer_schema.customer SET TAG raw_db.customer_schema.temp_tag = 'test';
--スキーマをクローン
USE DATABASE raw_db;
CREATE SCHEMA customer_schema_clone CLONE raw_db.customer_schema;
--クローン先のテーブルに付与されたタグを確認
USE ROLE SYSADMIN;
>SELECT * FROM TABLE(
raw_db.information_schema.tag_references('raw_db.customer_schema_clone.customer', 'table')
);
+--------------+-----------------------+--------------+-----------+----------+-----------------+-----------------------+-------------+--------+-------------+--------------+
| TAG_DATABASE | TAG_SCHEMA | TAG_NAME | TAG_VALUE | LEVEL | OBJECT_DATABASE | OBJECT_SCHEMA | OBJECT_NAME | DOMAIN | COLUMN_NAME | APPLY_METHOD |
|--------------+-----------------------+--------------+-----------+----------+-----------------+-----------------------+-------------+--------+-------------+--------------|
| TAG_DB | TAGS | ENVIRONMENT | dev | ACCOUNT | RAW_DB | CUSTOMER_SCHEMA_CLONE | CUSTOMER | TABLE | NULL | NULL |
| TAG_DB | TAGS | LAYER | raw | DATABASE | RAW_DB | CUSTOMER_SCHEMA_CLONE | CUSTOMER | TABLE | NULL | NULL |
| TAG_DB | TAGS | PII_CATEGORY | PII-DATA | TABLE | RAW_DB | CUSTOMER_SCHEMA_CLONE | CUSTOMER | TABLE | NULL | NULL |
| RAW_DB | CUSTOMER_SCHEMA_CLONE | TEMP_TAG | test | TABLE | RAW_DB | CUSTOMER_SCHEMA_CLONE | CUSTOMER | TABLE | NULL | NULL |
+--------------+-----------------------+--------------+-----------+----------+-----------------+-----------------------+-------------+--------+-------------+--------------+
最後の出力より、クローン先のテーブルで付与されているタグは、クローン先のスキーマに作成されたもの(クローンされたタグ)であることが確認できます。
その他、タグの伝播に関して、以下の記事内の「Automatic Tag Propagation」にもあるように将来的には上記以外の方法からもタグの伝播が可能な機能がリリースされる予定とのことです。
リネージグラフ上で依存関係にあるカラムにタグを付与する
2025年2月のアップデートで、Snowsight 上でリネージ図を確認できる機能が一般提供となっています。リネージグラフでは、上流や下流のカラムに対してタグを付与する必要がある列を識別し、タグを容易に適用できる機能が提供されています。
はじめにここではアカウントレベルのタグ適用権限を持つロールに以下の権限を付与し、リネージグラフを表示できるようにします。
USE ROLE ACCOUNTADMIN;
--リネージグラフの表示権限
GRANT VIEW LINEAGE ON ACCOUNT TO ROLE tag_admin;
--ロールで参照権限の無い依存関係にあるオブジェクトもリネージグラフ上で表示できる権限
GRANT RESOLVE ALL ON ACCOUNT TO ROLE tag_admin;
USE ROLE SECURITYADMIN;
--リネージグラフの表示にはテーブルのSELECT権限が必要(あわせて親データベース・スキーマの使用権限も必要)
GRANT USAGE ON DATABASE raw_db TO ROLE tag_admin;
GRANT USAGE ON SCHEMA raw_db.customer_schema TO ROLE tag_admin;
GRANT SELECT ON ALL TABLES IN SCHEMA raw_db.customer_schema TO ROLE tag_admin;
--リネージグラフの表示にはウェアハウスの使用権限が必要
GRANT USAGE ON WAREHOUSE COMPUTE_WH TO ROLE tag_admin;
その後、Snowsight 上でtag_admin
ロールに切り替え、でこれまでタグの付与を検証していたraw_db.customer_schema.customer
テーブルのリネージタブを開きます。
すると下図のようにcustomer
テーブルの他に、このテーブルから派生するビューやテーブル(stg_db.customer_schema.stg_customer
,mart_db.analytics.customer_purchase_summary
)も表示することができます。
customer
テーブルを選択すると表示される詳細メニューからcustomer_name
カラムをクリックします。
すると、カラムレベルのリネージが表示されます。ここでは最も上流のテーブルなので、下流のオブジェクトとして上述のビューやテーブルにも、raw_db.customer_schema.customer
テーブルのcustomer_name
カラムから派生するカラムがあることが確認できます。
さらに上部のメッセージで、この下流のオブジェクトカラムには、raw_db.customer_schema.customer
カラムに設定したタグが付与されていないことも警告のような形で通知してくれています。
下図のように「No tag」をマウスオーバーすると付与が推奨されるタグを確認できます。
右上の「Review and Apply」をクリックすると下図のようになり、付与が推奨されるカラムとタグのみが表示されます。
Apply をクリックすると下図の赤枠の下流のオブジェクトのカラムに、GUI 操作でまとめてタグを付与することができます。
さいごに
Snowflake のタグについて概要をまとめてみました。
リネージグラフ上で依存関係にあるカラムにまとめてタグを付与でき非常に便利と思いました。今後は、ビュー定義時などでもタグを引継げるようになるはずなので、このアップデートも期待したいです。
こちらの内容が何かの参考になれば幸いです。