0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

SnowflakeのテーブルにVIRTUAL_COLUMNって作れるの知ってた?

0
Last updated at Posted at 2026-03-09

VIRTUAL_COLUMN列??

Snowflakeの公式ドキュメント、ダイナミックテーブルところを見てたんです。

そしたらね、なんか書いてあるんですよ。
image.png

動作:仮想列にマスキングポリシーを適用する。
エラーメッセージ:SQLコンパイルエラー: マスキングポリシーをVIRTUAL_COLUMN列に添付できません。
トラブルシューティングアクション:ソーステーブルの列にマスキングポリシーを適用します。

VIRTUAL_COLUMN列??
何それ?

やってみる

ちょっと調べたらこういうことみたいです。

CREATE TABLE customer (
  first_name VARCHAR,
  last_name VARCHAR,
  full_name VARCHAR AS CONCAT(first_name, ' ', last_name)   --VIRTUAL_COLUMN
);

image.png

Table作成の際に

  • first_name
  • last_name
  • full_name → こいつは実体を持たず、first_nameとlast_nameをスペースを挟んでつなげた値。

このfull_nameがVIRTUAL_COLUMN列です。

INSERTしてみます。

INSERT INTO customer VALUES('first','last');

image.png

3カラムあるのですが、最後のVIRTUAL_COLUMN列はINSERTでは指定しないです。

select * from customer;

image.png
ちゃんとfull_nameにも値が入っています。

VIRTUAL_COLUMN列にもINSERTのVALUEを指定しちゃうと

INSERT INTO customer VALUES('first','last','full');

image.png

SQL compilation error: Insert value list does not match column list expecting 2 but got 3

期待してるのは2項目なのに3項目あるぞ!というエラーになります。

VIRTUAL_COLUMN列は実体を持たず、都度計算しているということですね。

VIRTUAL_COLUMN列、理解しました。

ではここからマスキングポリシーを付けていきます。

動作:仮想列にマスキングポリシーを適用する。

公式ドキュメントのこの一文で知ったからです。
VIRTUAL_COLUMN列にマスキングポリシーを適用するとエラーになるということで試してみます。

CREATE MASKING POLICY name_policy AS (val string) RETURNS string ->
  CASE
    WHEN CURRENT_ROLE() IN ('ACCOUNTADMIN') THEN val
    ELSE '*****'
  END;

image.png
マスキングポリシーができました。

customerテーブルに付けます。

まずはトラブルシューティングに書かれているエラーになるケース。

動作:仮想列にマスキングポリシーを適用する。

ALTER TABLE customer MODIFY COLUMN full_name
SET MASKING POLICY name_policy;

image.png

SQL compilation error: Masking policy cannot be attached to a VIRTUAL_COLUMN column.

確かに、

エラーメッセージ:SQLコンパイルエラー: マスキングポリシーをVIRTUAL_COLUMN列に添付できません。

というエラーですね。

対策は

トラブルシューティングアクション:ソーステーブルの列にマスキングポリシーを適用します。

ということなのでソーステーブル列、first_nameとlast_nameにマスキングポリシーを付けましょう。

ALTER TABLE customer MODIFY COLUMN
first_name SET MASKING POLICY name_policy,
last_name SET MASKING POLICY name_policy;

image.png
成功しました。

ACCOUNTADMINロールでselectしてみます。

select * from customer;

image.png
普通に見れました。

PUBLICロールに切り替えてselectしてみます。

use role public;
select * from customer;

image.png
Maskingが効いています。

まとめ

動作:仮想列にマスキングポリシーを適用する。
エラーメッセージ:SQLコンパイルエラー: マスキングポリシーをVIRTUAL_COLUMN列に添付できません。
トラブルシューティングアクション:ソーステーブルの列にマスキングポリシーを適用します。

これを実証できました。

VIRTUAL_COLUMN列、公式ドキュメントには項目としては書かれてなくて、こんな感じでダイナミックテーブルのところにサラっと書いてあるだけでマイナーなんじゃないかと思いまして共有しました。
こんな列の持ち方もあるんですね。
普通ならView作るケースだと思うんですが、自分のテーブルの中で項目レベルのviewみたいなことができるよと。
(Insertでエラーになるケースとか、扱いが難しそう)

なお、ダイナミックテーブルのドキュメント始まりでしたが、この検証ではダイナミックテーブルは使いませんでした。

ではでは〜。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?