Snowflake

Snowflake Projection Policies: 列投影制御でデータを守る

2026-03-26
更新: 2026-03-27
NicheeLab編集部

Projection Policyは、テーブルの特定の列がSELECTリストに投影(projection)されること自体を制御するSnowflakeのデータガバナンス機能です。 Masking Policyがデータ値を変換して返すのに対し、Projection Policyは列の出力そのものを許可または禁止します。 禁止された列をSELECTしようとするとクエリがエラーになるため、機密列の存在自体をクエリ結果から完全に排除できます。Enterprise Edition以上で利用可能です。

Masking PolicyとProjection Policyの違い

比較項目Masking PolicyProjection Policy
制御対象列の値を変換(マスク)して返す列の投影(出力)自体を許可/禁止
SELECT *の挙動マスクされた値が返されるクエリがエラーになる
WHERE句での使用マスク前の値でフィルタ可能制限列でのフィルタも禁止
JOIN条件での使用マスク前の値で結合可能制限列での結合も禁止
集計関数での使用マスク前の値で集計可能制限列での集計も禁止
戻り値の型引数と同じデータ型PROJECTION_CONSTRAINT(ALLOW/BLOCK)
同一列への併用Projection Policyとは併用不可Masking Policyとは併用不可
用途値を部分的に見せたい場合列自体を完全に隠したい場合

Projection 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代替パターン

従来、列の非表示は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;

Tag-based Projection Policy

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;

  1. employee_idとnameが返される(WHERE句のssn参照はProjection Policyの対象外)
  2. クエリがProjection Policy違反でエラーになる
  3. ssn列がNULLにマスクされた状態でemployee_idとnameが返される
  4. WHERE条件が無視されてemployee_idとnameの全行が返される

正解: 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以上に位置づけられています。

この記事で学んだ内容を問題で確認しましょう

16,000問以上の問題で実力チェック

無料で問題を解いてみる
この記事の著者

NicheeLab編集部

データエンジニアリング・クラウド資格の専門家。Databricks・Snowflake等の認定資格を保有し、実務経験に基づいた問題作成・解説を行っています。NicheeLab運営。


関連記事
Snowflake

Snowflake資格一覧|全11試験(SnowPro)の難易度・費用

Snowflake認定資格(SnowPro)全11試験の一覧・難易度・費用・出題範囲を徹底解説。...

Snowflake

Snowflake試験の難易度ランキング|全11資格を徹底比較

Snowflake(SnowPro)認定全11試験の難易度をランキング形式で比較。学習時間・合格に必要なスキルから分析。...

Snowflake

Snowflake資格の勉強方法|効率的な学習ルートと合格のコツ

Snowflake認定資格(SnowPro)に最短で合格するための勉強方法。公式リソース・学習スケジュールを徹底ガイド。...

Snowflake

SnowPro Core試験完全解説|出題範囲・問題例・合格戦略

SnowPro Core Certification(COF-C03)を徹底解説。出題範囲・100問の試験形式・合格ライ...

Snowflake

SnowPro Platform Associate完全解説|入門試験の攻略

SnowPro Associate: Platform Certification(SOL-C01)を徹底解説。最も簡単...

Snowflakeの記事一覧 (102件)
© 2026 NicheeLab All rights reserved.