Aggregation Policyは、Snowflakeが提供するデータガバナンス機能の一つで、 クエリ結果に含まれる各集約グループが最小行数(MIN_GROUP_SIZE)を満たしていることを強制します。 個人や少数グループのデータが推測されるリスクを構造的に排除でき、Enterprise Edition以上で利用可能です。
データ分析においてGROUP BYで集計した結果、特定グループの行数が1〜2件しかない場合、 その集計値から個人を特定できるリスクがあります。たとえば「地域=北海道、年齢=65歳以上、疾患=糖尿病」 のグループが1件しか存在しなければ、平均値や合計値はそのまま個人の値を意味します。 Aggregation Policyはこのような小グループ攻撃(Small Group Attack)を防止します。
-- 基本的な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を指定すると、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を禁止 |
-- 定義済みポリシーの一覧
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権限 |
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件しか存在しないものとする。
正解: 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ビューで確認できます。
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)を徹底解説。最も簡単...