Snowflake

Masking Policy vs Row Access Policyの違いを8項目で比較

2026-03-26
更新: 2026-03-27
NicheeLab編集部
目次
  1. 8項目比較表
  2. Masking Policyの実装例
  3. Row Access Policyの実装例
  4. 同時適用パターン
  5. Secure Viewとの使い分け
  6. 設計判断ガイド
  7. 落とし穴と注意点
  8. Conditional Masking(条件付きマスキング)
  9. 問題で確認
  10. よくある質問

Snowflakeのデータ保護機能の中核をなすMasking PolicyとRow Access Policyは、 どちらもEnterprise Edition以上で利用できるポリシーベースのアクセス制御ですが、制御の対象と動作が根本的に異なります。 Masking Policyは列の値を変換して返し、Row Access Policyは行の可視性をフィルタします。 両者を正しく使い分け、必要に応じて同時適用する設計が、SnowPro Advanced: Security Engineer試験でも実務でも求められます。

8項目比較表

比較項目Masking PolicyRow Access Policy
制御対象列の値(カラム値の変換)行の可視性(レコードのフィルタ)
戻り値の型引数と同じデータ型(マスク済み値を返す)BOOLEAN(TRUE=表示 / FALSE=非表示)
アタッチ対象列(Column)ごとに1つテーブル/ビューに1つ
SELECT *の挙動マスクされた値が返されるフィルタされた行のみ返される
COUNT(*)への影響影響なし(行数は変わらない)フィルタ後の行数が返される
WHERE句での動作マスク前の値でフィルタが実行されるポリシー条件でフィルタされた後にWHERE句が適用される
Tag-based適用ALTER TAG SET MASKING POLICY で自動適用可能ALTER TAG SET ROW ACCESS POLICY で自動適用可能
必要権限CREATE MASKING POLICY + APPLY MASKING POLICYCREATE ROW ACCESS POLICY + APPLY ROW ACCESS POLICY

Masking Policyの実装例

-- メールアドレスのマスキング
CREATE OR REPLACE MASKING POLICY mask_email
  AS (val VARCHAR) RETURNS VARCHAR ->
  CASE
    WHEN IS_ROLE_IN_SESSION('HR_ADMIN') THEN val
    WHEN IS_ROLE_IN_SESSION('MANAGER') THEN
      CONCAT(LEFT(val, 2), '****@', SPLIT_PART(val, '@', 2))
    ELSE '****@****.***'
  END;

-- 列にアタッチ
ALTER TABLE hr.employees
  ALTER COLUMN email
  SET MASKING POLICY mask_email;

-- 数値型の給与マスキング
CREATE OR REPLACE MASKING POLICY mask_salary
  AS (val NUMBER) RETURNS NUMBER ->
  CASE
    WHEN IS_ROLE_IN_SESSION('HR_ADMIN') THEN val
    WHEN IS_ROLE_IN_SESSION('MANAGER') THEN
      ROUND(val, -4)  -- 万単位に丸め
    ELSE NULL
  END;

ALTER TABLE hr.employees
  ALTER COLUMN salary
  SET MASKING POLICY mask_salary;

Row Access Policyの実装例

-- 部署ベースの行フィルタ
CREATE OR REPLACE ROW ACCESS POLICY rap_department
  AS (dept_val VARCHAR) RETURNS BOOLEAN ->
  IS_ROLE_IN_SESSION('HR_ADMIN')
  OR dept_val = (
    SELECT department FROM hr.user_dept_mapping
    WHERE user_name = CURRENT_USER()
  );

-- テーブルにアタッチ
ALTER TABLE hr.employees
  ADD ROW ACCESS POLICY rap_department ON (department);

同時適用パターン

Masking PolicyとRow Access Policyは同一テーブルに同時に適用可能です。 この場合、Row Access Policy → Masking Policyの順で評価されます。

-- シナリオ: hr.employeesテーブルに両方を適用
-- Row Access Policy: 自部署の社員のみ表示
-- Masking Policy: salary列をロールに応じてマスク

-- Step 1: Row Access Policyをアタッチ
ALTER TABLE hr.employees
  ADD ROW ACCESS POLICY rap_department ON (department);

-- Step 2: Masking Policyをアタッチ
ALTER TABLE hr.employees
  ALTER COLUMN salary
  SET MASKING POLICY mask_salary;

ALTER TABLE hr.employees
  ALTER COLUMN email
  SET MASKING POLICY mask_email;

-- 結果(MANAGERロールの場合):
-- 1. Row Access Policyで自部署の社員のみに絞られる
-- 2. salary列は万単位に丸められる
-- 3. email列は先頭2文字+マスクされた形で返される

Secure Viewとの使い分け

比較項目Masking / Row Access PolicySecure View
適用範囲テーブルへの全アクセス経路に適用View経由のアクセスのみ
View定義の秘匿ポリシーロジックはOWNERのみ確認可能GET_DDLでView定義が見えない
オプティマイザ最適化通常の最適化が適用される一部の最適化が制限される
管理コストテーブル+ポリシーで管理ロールごとにView作成が必要な場合がある
Data Sharingとの相性ポリシーは共有先でも有効Secure ViewはData Sharingで推奨される

設計判断ガイド

要件: 特定のユーザー/ロールにデータを制限したい
│
├─ 行単位で制限したい(例: 自部署の社員のみ表示)
│   └─ → Row Access Policy
│
├─ 列の値を変換して返したい(例: SSNの一部をマスク)
│   └─ → Masking Policy
│
├─ 列自体を完全に非表示にしたい
│   ├─ クエリ結果から列を除外 → Projection Policy
│   └─ View定義で列を除外   → Secure View
│
└─ 行制限 + 列マスクの両方
    └─ → Row Access Policy + Masking Policy を併用

落とし穴と注意点

  • Masking PolicyとWHERE句:Masking Policyはクエリ結果の表示時に適用されますが、WHERE句のフィルタはマスク前の値で実行されます。つまりSELECT email WHERE email = '[email protected]' は、emailがマスクされて返されてもWHEREの条件は元の値で評価されます
  • Row Access PolicyとCOUNT:Row Access Policyが適用されたテーブルでCOUNT(*)を実行すると、フィルタ後の行数が返されます。テーブル全体の行数を別チャネルで知っているユーザーは、自分に見えない行数を推測できるリスクがあります
  • ポリシーのデバッグ:ポリシーのロジックはOWNERロールでDESCRIBE MASKING POLICY / DESCRIBE ROW ACCESS POLICYで確認できます。意図した動作をテスト用ロールで検証してからプロダクション適用することが重要です
  • Conditional Masking:Masking Policyの引数に複数列を渡すことで、他の列の値に基づいたマスキングが可能です(例:regionがAPACの場合のみマスク解除)

Conditional Masking(条件付きマスキング)

-- 他の列の値に基づいてマスクを切り替え
CREATE OR REPLACE MASKING POLICY mask_salary_by_region
  AS (salary_val NUMBER, region_val VARCHAR) RETURNS NUMBER ->
  CASE
    WHEN IS_ROLE_IN_SESSION('HR_ADMIN') THEN salary_val
    WHEN IS_ROLE_IN_SESSION('APAC_MANAGER')
      AND region_val = 'APAC' THEN salary_val
    ELSE NULL
  END;

-- 2つの列をマッピングしてアタッチ
ALTER TABLE hr.employees
  ALTER COLUMN salary
  SET MASKING POLICY mask_salary_by_region
  USING (salary, region);

問題で確認

Security & Governance

問題 1

hr.employeesテーブルにRow Access Policy(department列で自部署のみ表示)とMasking Policy(salary列をNULL化)が同時に適用されている。ANALYST_ROLE(Engineering部署)のユーザーがSELECT department, salary, COUNT(*) OVER() FROM hr.employeesを実行した場合の結果として正しいものはどれか。

  1. 全部署の社員が表示され、salary列がNULLで、COUNT(*)にはテーブル全体の行数が表示される
  2. Engineering部署の社員のみ表示され、salary列がNULLで、COUNT(*)にはEngineering部署の人数が表示される
  3. Engineering部署の社員のみ表示され、salary列は元の値が表示され、COUNT(*)にはEngineering部署の人数が表示される
  4. クエリがエラーになる(Row Access PolicyとMasking Policyは同時適用できないため)

正解: B

Row Access PolicyとMasking Policyは同時に適用可能です。まずRow Access Policyが評価され、Engineering部署の行のみが残ります。次にMasking Policyが適用され、salary列がNULLに変換されます。COUNT(*) OVER()はRow Access Policy適用後の行数(Engineering部署の人数)を返します。この評価順序(Row Access → Masking)はSnowflakeが内部的に制御しています。

よくある質問

Masking PolicyとRow Access Policyを同時に適用した場合、どちらが先に評価されますか?

SnowflakeはRow Access Policyを先に評価し、フィルタを通過した行に対してMasking Policyを適用します。この順序はSnowflake内部で固定されており、ユーザーが変更することはできません。例えば、ある行がRow Access Policyでフィルタされた場合、その行に対するMasking Policyは評価されません(行自体が結果に含まれないため)。

Masking PolicyとRow Access Policyの権限管理は分離すべきですか?

はい。SnowflakeではAPPLY MASKING POLICYとAPPLY ROW ACCESS POLICYは別々の権限として管理されます。ポリシーのOWNERSHIP(作成・変更権限)とAPPLY権限(テーブルへのアタッチ権限)も分離することで、職務分掌を実現できます。例えばセキュリティチームがポリシーを作成(OWNERSHIP)し、データエンジニアが個別テーブルに適用(APPLY)する運用が可能です。

Secure ViewでMasking PolicyやRow Access Policyの代替はできますか?

Secure Viewは列の除外やWHERE句での行フィルタを実現できますが、テーブルを直接クエリする場合やView経由以外のアクセスには制御が効きません。Masking Policy/Row Access Policyはテーブルにアタッチされるため、直接クエリ・View・ストアドプロシージャなど全てのアクセス経路に適用されます。Secure ViewはView定義の秘匿が必要な場合に併用し、データ保護の主軸はポリシーベースで設計するのが推奨されます。

クラウドの基礎から読む

資格の話をしない、クラウドそのものの入門 8 章があります。登録なしで全部読めます。

第 0 部・無料

クラウド自体がはじめての方へ

サーバー・ネットワーク・データベースの前提知識なしで読める 8 章。登録不要・無料。

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

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

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

NicheeLab編集部

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


関連記事
Snowflake

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

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

Snowflake

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

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

Snowflake

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

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

Snowflake

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

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

Snowflake

SnowPro Platform Associate(SOL-C01)完全解説|現在は予約不可・試験内容と次の受験先

SnowPro Associate: Platform(SOL-C01)は2026年10月時点でSnowflakeの公式...

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