Snowflake

Snowflake Aggregation Policiesで集約を強制しプライバシーを保護する方法

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

Aggregation Policyは、Snowflakeが提供するデータガバナンス機能の一つで、 クエリ結果に含まれる各集約グループが最小行数(MIN_GROUP_SIZE)を満たしていることを強制します。 個人や少数グループのデータが推測されるリスクを構造的に排除でき、Enterprise Edition以上で利用可能です。

なぜ集約を強制する必要があるのか

データ分析においてGROUP BYで集計した結果、特定グループの行数が1〜2件しかない場合、 その集計値から個人を特定できるリスクがあります。たとえば「地域=北海道、年齢=65歳以上、疾患=糖尿病」 のグループが1件しか存在しなければ、平均値や合計値はそのまま個人の値を意味します。 Aggregation Policyはこのような小グループ攻撃(Small Group Attack)を防止します。

CREATE AGGREGATION POLICY構文

-- 基本的なAggregation Policyの作成
CREATE OR REPLACE AGGREGATION POLICY privacy_db.policies.min_group_5
  AS () RETURNS AGGREGATION_CONSTRAINT ->
    AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5);

-- 条件付きポリシー:ロールによって集約制約を変える
CREATE OR REPLACE AGGREGATION POLICY privacy_db.policies.role_based_agg
  AS () RETURNS AGGREGATION_CONSTRAINT ->
    CASE
      WHEN CURRENT_ROLE() IN ('DATA_SCIENTIST', 'ADMIN')
        THEN AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 0)
      WHEN CURRENT_ROLE() = 'ANALYST'
        THEN AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 5)
      ELSE
        AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => 20)
    END;

ポリシー本体はSQL式で記述し、AGGREGATION_CONSTRAINT(MIN_GROUP_SIZE => N)を返します。 MIN_GROUP_SIZEを0にすると集約制約なし(生データアクセス可能)になります。 CASE式でCURRENT_ROLE()やIS_ROLE_IN_SESSION()を使えば、ロール別に制約レベルを切り替えられます。

テーブル・ビューへの適用

-- テーブルにAggregation Policyを適用
ALTER TABLE medical_db.public.patient_records
  SET AGGREGATION POLICY privacy_db.policies.min_group_5;

-- ENTITYキーを指定して適用(エンティティ単位の集約を強制)
ALTER TABLE medical_db.public.patient_records
  SET AGGREGATION POLICY privacy_db.policies.min_group_5
  ENTITY KEY (patient_id);

-- ビューにも適用可能
ALTER VIEW medical_db.public.patient_summary
  SET AGGREGATION POLICY privacy_db.policies.min_group_5
  ENTITY KEY (patient_id);

-- ポリシーの解除
ALTER TABLE medical_db.public.patient_records
  UNSET AGGREGATION POLICY;

ENTITY KEYの役割

ENTITY KEYを指定すると、MIN_GROUP_SIZEの判定が「行数」ではなく「一意のエンティティ数」で行われます。 たとえばENTITY KEY (patient_id)でMIN_GROUP_SIZE=5の場合、 各グループに5人以上の患者が含まれていないとクエリが拒否されます。 1人の患者が複数行を持つ場合でも、行数ではなく患者数でカウントされる点が重要です。

ポリシー適用後のクエリ動作

-- ポリシー適用テーブルへのクエリ例
-- MIN_GROUP_SIZE=5 / ENTITY KEY=patient_id の場合

-- OK: 各地域に5人以上の患者がいれば成功
SELECT region, AVG(age) AS avg_age, COUNT(*) AS cnt
FROM medical_db.public.patient_records
GROUP BY region;

-- NG: 特定地域の患者が5人未満なら全体がエラー
-- Error: Aggregation policy violation

-- 対処法: HAVINGで小グループを除外
SELECT region, AVG(age) AS avg_age, COUNT(*) AS cnt
FROM medical_db.public.patient_records
GROUP BY region
HAVING COUNT(DISTINCT patient_id) >= 5;

-- 集約なしのSELECT *はブロック(MIN_GROUP_SIZE > 0の場合)
SELECT * FROM medical_db.public.patient_records;
-- Error: Query does not contain an aggregate function

ガバナンスポリシー比較表

ポリシー保護対象適用単位動作
Aggregation Policy集計結果の粒度テーブル / ビューMIN_GROUP_SIZE未満のグループを含むクエリをブロック
Masking Policy列の値ロールに応じて値をNULLや固定値に置換
Row Access Policy行の可視性テーブル / ビュー条件を満たさない行をフィルタリング
Projection Policy列の投影特定ロールに列のSELECTを禁止

ポリシー管理SQL

-- 定義済みポリシーの一覧
SHOW AGGREGATION POLICIES IN SCHEMA privacy_db.policies;

-- ポリシーの詳細を確認
DESCRIBE AGGREGATION POLICY privacy_db.policies.min_group_5;

-- ポリシーの適用先を確認
SELECT *
FROM TABLE(
  INFORMATION_SCHEMA.POLICY_REFERENCES(
    POLICY_NAME => 'privacy_db.policies.min_group_5'
  )
);

-- Account Usageビューで全ポリシー参照を確認
SELECT policy_name, ref_entity_name, ref_entity_domain
FROM SNOWFLAKE.ACCOUNT_USAGE.POLICY_REFERENCES
WHERE policy_kind = 'AGGREGATION_POLICY';

-- ポリシーの削除(適用解除が先に必要)
DROP AGGREGATION POLICY privacy_db.policies.min_group_5;

必要な権限

操作必要な権限
CREATE AGGREGATION POLICYスキーマに対するCREATE AGGREGATION POLICY権限
ALTER TABLE SET AGGREGATION POLICYテーブルに対するOWNERSHIP + ポリシーに対するAPPLY権限
DROP AGGREGATION POLICYポリシーに対するOWNERSHIP権限

設計・運用ベストプラクティス

  • 専用スキーマでポリシーを集中管理:privacy_db.policiesのようなスキーマにすべてのAggregation Policyをまとめ、APPLY権限を特定ロールのみに付与する
  • ENTITY KEYを必ず指定:行数ベースだと重複レコードで実質的な保護レベルが下がるため、エンティティの主キーを指定する
  • テスト環境でMIN_GROUP_SIZEを検証:既存クエリのうちどの程度がポリシー違反となるか事前に調査し、分析チームへ周知する
  • 条件付きポリシーで段階的導入:まずADMINロールはMIN_GROUP_SIZE=0で除外し、分析ロールのみに制約をかけて段階的に展開する
  • Masking PolicyやRow Access Policyと組み合わせる:集約制約だけでなく、センシティブ列のマスキングや行レベルフィルタも併用して多層防御を構築する

問題で確認

Data Governance

問題 1

医療データを扱うテーブルにAggregation Policyが適用されており、ENTITY KEY (patient_id)、MIN_GROUP_SIZE=5が設定されている。以下のクエリを実行した結果として正しいものはどれか。 SELECT region, AVG(blood_pressure) FROM patients GROUP BY region; ただし、region='北海道'のグループにはpatient_idが3件しか存在しないものとする。

  1. 北海道のグループのみNULLが返され、他の地域は正常に集計される
  2. 北海道のグループが自動的に除外され、他の地域の結果のみ返される
  3. クエリ全体がAggregation Policy Violationエラーとなり、結果は一切返されない
  4. 北海道のグループのAVG値が自動的にノイズ付加された近似値として返される

正解: C

Aggregation Policyでは、GROUP BYの結果のいずれかのグループがMIN_GROUP_SIZE未満の場合、クエリ全体がエラーとなります。北海道のpatient_idが3件でMIN_GROUP_SIZE=5を下回るため、他の地域を含めたクエリ全体が拒否されます。小グループの自動除外やノイズ付加は行われません。HAVING COUNT(DISTINCT patient_id) >= 5を追加することで、小グループを除外して実行可能です。

よくある質問

Aggregation PolicyのMIN_GROUP_SIZEに指定する値の目安はどのくらいですか?

統計的な再識別リスクを抑えるには最低でも5以上が推奨されます。GDPRやHIPAAなどの規制環境下ではMIN_GROUP_SIZEを10〜20に設定するケースもあります。ただし値を大きくするほどクエリで返せる粒度が制限されるため、分析要件とプライバシー要件のバランスを取って設定します。設定後はIS_AGGREGATION_POLICY_MET()を使ってテストクエリで動作確認を行いましょう。

Aggregation PolicyとDynamic Data Masking Policyの違いは何ですか?

Masking Policyは個々の列の値をロール単位で隠蔽・変換する機能で、SELECT時にNULLや固定文字列に置き換えます。一方Aggregation Policyはクエリ結果が十分に集約されていることを強制し、GROUP BYの結果グループが指定件数に満たない場合にクエリ自体をブロックします。Masking Policyは『誰に何を見せるか』の制御、Aggregation Policyは『どの粒度まで集計結果を返すか』の制御であり、併用も可能です。

Aggregation Policyが適用されたテーブルで、ポリシー違反のクエリはどうなりますか?

GROUP BY句の各グループに含まれる行数がMIN_GROUP_SIZE未満の場合、クエリ全体がエラーとなり結果は一切返されません。エラーメッセージには'Aggregation policy violation'が含まれます。HAVING COUNT(*) >= <MIN_GROUP_SIZE>を追加すれば小グループを除外でき、クエリを通すことが可能です。ポリシー違反の監査ログはACCOUNT_USAGE.POLICY_REFERENCESビューで確認できます。

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

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.