VIRTUAL_COLUMN列??
Snowflakeの公式ドキュメント、ダイナミックテーブルところを見てたんです。
動作:仮想列にマスキングポリシーを適用する。
エラーメッセージ: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
);
Table作成の際に
- first_name
- last_name
- full_name → こいつは実体を持たず、first_nameとlast_nameをスペースを挟んでつなげた値。
このfull_nameがVIRTUAL_COLUMN列です。
INSERTしてみます。
INSERT INTO customer VALUES('first','last');
3カラムあるのですが、最後のVIRTUAL_COLUMN列はINSERTでは指定しないです。
select * from customer;
VIRTUAL_COLUMN列にもINSERTのVALUEを指定しちゃうと
INSERT INTO customer VALUES('first','last','full');
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;
customerテーブルに付けます。
まずはトラブルシューティングに書かれているエラーになるケース。
動作:仮想列にマスキングポリシーを適用する。
ALTER TABLE customer MODIFY COLUMN full_name
SET MASKING POLICY name_policy;
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;
ACCOUNTADMINロールでselectしてみます。
select * from customer;
PUBLICロールに切り替えてselectしてみます。
use role public;
select * from customer;
まとめ
動作:仮想列にマスキングポリシーを適用する。
エラーメッセージ:SQLコンパイルエラー: マスキングポリシーをVIRTUAL_COLUMN列に添付できません。
トラブルシューティングアクション:ソーステーブルの列にマスキングポリシーを適用します。
これを実証できました。
VIRTUAL_COLUMN列、公式ドキュメントには項目としては書かれてなくて、こんな感じでダイナミックテーブルのところにサラっと書いてあるだけでマイナーなんじゃないかと思いまして共有しました。
こんな列の持ち方もあるんですね。
普通ならView作るケースだと思うんですが、自分のテーブルの中で項目レベルのviewみたいなことができるよと。
(Insertでエラーになるケースとか、扱いが難しそう)
なお、ダイナミックテーブルのドキュメント始まりでしたが、この検証ではダイナミックテーブルは使いませんでした。
ではでは〜。









