Projection Policyは、テーブルの特定の列がSELECTリストに投影(projection)されること自体を制御するSnowflakeのデータガバナンス機能です。 Masking Policyがデータ値を変換して返すのに対し、Projection Policyは列の出力そのものを許可または禁止します。 禁止された列をSELECTしようとするとクエリがエラーになるため、機密列の存在自体をクエリ結果から完全に排除できます。Enterprise Edition以上で利用可能です。
| 比較項目 | Masking Policy | Projection Policy |
|---|---|---|
| 制御対象 | 列の値を変換(マスク)して返す | 列の投影(出力)自体を許可/禁止 |
| SELECT *の挙動 | マスクされた値が返される | クエリがエラーになる |
| WHERE句での使用 | マスク前の値でフィルタ可能 | 制限列でのフィルタも禁止 |
| JOIN条件での使用 | マスク前の値で結合可能 | 制限列での結合も禁止 |
| 集計関数での使用 | マスク前の値で集計可能 | 制限列での集計も禁止 |
| 戻り値の型 | 引数と同じデータ型 | PROJECTION_CONSTRAINT(ALLOW/BLOCK) |
| 同一列への併用 | Projection Policyとは併用不可 | Masking Policyとは併用不可 |
| 用途 | 値を部分的に見せたい場合 | 列自体を完全に隠したい場合 |
-- Projection Policyの作成
CREATE OR REPLACE PROJECTION POLICY pp_hide_ssn
AS () RETURNS PROJECTION_CONSTRAINT ->
CASE
WHEN IS_ROLE_IN_SESSION('HR_ADMIN')
THEN PROJECTION_CONSTRAINT(ALLOW => TRUE)
ELSE PROJECTION_CONSTRAINT(ALLOW => FALSE)
END;
-- テーブルの列にアタッチ
ALTER TABLE hr.employees
ALTER COLUMN ssn
SET PROJECTION POLICY pp_hide_ssn;
-- ポリシーの解除
ALTER TABLE hr.employees
ALTER COLUMN ssn
UNSET PROJECTION POLICY;-- HR_ADMINロールでアクセス(投影が許可される)
USE ROLE HR_ADMIN;
SELECT employee_id, name, ssn FROM hr.employees;
-- 結果: employee_id, name, ssn が全て返される
-- ANALYSTロールでアクセス(投影が禁止される)
USE ROLE ANALYST;
SELECT employee_id, name, ssn FROM hr.employees;
-- ERROR: Projection policy violation
-- SSN列を除外すればクエリは成功
SELECT employee_id, name FROM hr.employees;
-- 結果: employee_id, name が返される
-- SELECT * もSSN列を含むためエラー
SELECT * FROM hr.employees;
-- ERROR: Projection policy violation
-- WHERE句でSSN列を参照してもエラー
SELECT employee_id, name FROM hr.employees
WHERE ssn = '123-45-6789';
-- ERROR: Projection policy violation従来、列の非表示はSecure Viewで実現するのが一般的でした。 Projection Policyを使うと、ビューを個別に作成せずにテーブルレベルで直接制御できます。
-- 従来のSecure View方式:列の除外はView定義に依存
CREATE OR REPLACE SECURE VIEW hr.employees_analyst AS
SELECT employee_id, name, department, hire_date
FROM hr.employees;
-- SSN列はView定義から除外 → ANALYSTはこのViewを使う
-- Projection Policy方式:テーブルに直接制御を適用
-- View不要で、テーブルを直接クエリしても列が制御される
ALTER TABLE hr.employees
ALTER COLUMN ssn
SET PROJECTION POLICY pp_hide_ssn;
ALTER TABLE hr.employees
ALTER COLUMN salary
SET PROJECTION POLICY pp_hide_salary;
-- ANALYSTは直接テーブルをクエリでき、制限列だけが使えない| 比較項目 | Secure View方式 | Projection Policy方式 |
|---|---|---|
| 列制御の粒度 | View定義で列を選択 | 列単位でポリシーをアタッチ |
| 管理対象オブジェクト | ロールごとにViewが必要になることがある | テーブル+ポリシーのみ |
| View定義の秘匿 | Secure Viewで定義を隠せる | ポリシーのOWNERのみがロジックを確認可能 |
| パフォーマンス | Secure Viewの最適化制限あり | テーブル直接アクセスでオプティマイザの最適化が効く |
| 既存クエリへの影響 | View経由に書き換えが必要 | 制限列を含むクエリのみエラーに変わる |
-- Projection Policyの作成権限
GRANT CREATE PROJECTION POLICY ON SCHEMA security
TO ROLE policy_admin;
-- Projection Policyのアタッチ権限
GRANT APPLY PROJECTION POLICY ON ACCOUNT
TO ROLE policy_admin;
-- ポリシー一覧の確認
SHOW PROJECTION POLICIES IN SCHEMA security;
-- ポリシーの詳細確認
DESCRIBE PROJECTION POLICY pp_hide_ssn;Object Taggingと組み合わせて、特定のタグが付与された列に自動的にProjection Policyを適用できます。 新しい列にタグを付けるだけでポリシーが自動適用されるため、大規模環境でのガバナンス管理が効率化します。
-- タグの作成
CREATE TAG governance.pii_level
ALLOWED_VALUES 'HIGH', 'MEDIUM', 'LOW';
-- Projection Policyをタグに紐づけ
ALTER TAG governance.pii_level
SET PROJECTION POLICY pp_hide_ssn;
-- 列にタグを設定(自動的にProjection Policyが適用される)
ALTER TABLE hr.employees
ALTER COLUMN ssn
SET TAG governance.pii_level = 'HIGH';Security & Governance
問題 1
hr.employeesテーブルのssn列にProjection Policyが適用されており、ANALYST_ROLEには投影が禁止されている。ANALYST_ROLEのユーザーが以下のクエリを実行した場合の結果はどれか。SELECT employee_id, name FROM hr.employees WHERE ssn IS NOT NULL;
正解: B
Projection Policyは列の投影だけでなく、WHERE句・JOIN条件・集計関数など、その列へのあらゆる参照を禁止します。SELECTリストにssn列が含まれていなくても、WHERE ssn IS NOT NULLでssn列を参照しているためポリシー違反となりエラーが発生します。これがMasking Policyとの大きな違いで、Masking Policyの場合はWHERE句での参照は許可されます。
Projection PolicyをアタッチしたテーブルでSELECT *を実行するとどうなりますか?
Projection Policyで制限された列をSELECT *で取得しようとすると、クエリ自体がエラーになります。Masking Policyの場合はマスクされた値が返されますが、Projection Policyは列の投影自体を禁止するため、制限列を明示的または暗黙的(SELECT *)に含むクエリは実行できません。ユーザーは制限された列を除外してSELECTリストを明示的に指定する必要があります。
Projection PolicyとMasking Policyは同じ列に同時に適用できますか?
同じ列にProjection PolicyとMasking Policyの両方を適用することはできません。Projection Policyはその列の投影自体を制御し、Masking Policyは列値の変換を制御するため、役割が本質的に異なります。列を完全に非表示にしたい場合はProjection Policy、値をマスクして返したい場合はMasking Policyを選択します。
Projection Policyは全Editionで利用できますか?
Projection PolicyはEnterprise Edition以上で利用可能です。Standard Editionでは利用できません。Secure ViewやMasking Policyと同様に、データガバナンス系の機能はEnterprise Edition以上に位置づけられています。
NicheeLab編集部
データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。
Snowflake資格一覧|全11試験(SnowPro)の難易度・費用
Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...
Snowflake試験の難易度ランキング|全11資格を徹底比較
Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...
Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ
Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...
SnowPro Core試験完全解説|出題範囲・問題例・合格戦略
SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...
SnowPro Platform Associate完全解説|入門試験の攻略
SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...