BigQuery でデータポリシーを列に直接関連付ける機能を試してみた

BigQuery でデータポリシーを列に直接関連付ける機能を試してみた

2026.02.28

こんにちは!エノカワです。

以前、ポリシータグを使った列レベルのデータマスキングを試しました。

https://dev.classmethod.jp/articles/bigquery-own-masking-routines/

上記の記事では、タクソノミー(Data Catalog 上でポリシータグをまとめるための分類)とポリシータグを作成し、データポリシーをポリシータグに紐付け、さらにポリシータグを列に設定するという手順でマスキングを実現しています。

2026年2月4日のリリースノートで、データポリシーを列に直接関連付ける機能が GA になりました。

You can now associate data policies directly on columns. This feature enables direct database administration for controlling access and applying masking and transformation rules at the column level. This feature is now generally available (GA).

タクソノミーやポリシータグを経由せずに、データポリシーを列に直接紐付けできるようです。
前回記事と同じマスキングをこの機能で実現できるか、さっそく試してみました。

やってみた

以下の流れで試しました。

  1. データポリシーの作成(SQL でマスキング用ポリシーを作成)
  2. 既存の users テーブルの列に ALTER でデータポリシーを付与
  3. マスクされたデータの閲覧権限を付与してマスク結果を確認

検証で使用したサンプルテーブル

前回記事と同じ構成の users テーブルを、今回の検証用に別のデータセット(datapolicy_work)で用意しました。
ポリシータグは付与していません。

テーブルには idnamebirthday(生年月日)、email(メールアドレス)、postcode(郵便番号)の列があり、birthdayemailpostcode をマスキング対象とします。

bigquery-column-data-policy_01.png

スキーマを見ると、ポリシータグもデータポリシーも付いていない状態です。

bigquery-column-data-policy_02.png

データポリシーの作成

データポリシーは SQL(CREATE DATA_POLICY)で作成します。

email 列用(定義済み: 電子メールマスク)

CREATE OR REPLACE DATA_POLICY `region-asia-northeast1.email_mask_policy`
OPTIONS (
  data_policy_type="DATA_MASKING_POLICY",
  masking_expression="EMAIL_MASK"
);

クエリ結果に「このステートメントで新しいデータポリシーが作成されました。」と表示されました。

bigquery-column-data-policy_03.png

同様に、birthday 列用と postcode 列用のデータポリシーも作成します。

birthday 列用(定義済み: 日付年マスク)

CREATE OR REPLACE DATA_POLICY `region-asia-northeast1.birthday_mask_policy`
OPTIONS (
  data_policy_type="DATA_MASKING_POLICY",
  masking_expression="DATE_YEAR_MASK"
);

postcode 列用(カスタムルーティン)

前回記事で作成した masking_work.POSTCODE_Mask(郵便番号の数字を X に置き換える UDF)をカスタムマスキングルーティンとして指定します。
同一プロジェクト内の他データセットにあるルーティンも参照できます。

CREATE OR REPLACE DATA_POLICY `region-asia-northeast1.postcode_mask_policy`
OPTIONS (
  data_policy_type="DATA_MASKING_POLICY",
  masking_expression="masking_work.POSTCODE_Mask"
);

masking_expression には EMAIL_MASKDATE_YEAR_MASK などの定義済みマスキング式のほか、カスタムルーティンを データセット名.ルーティン名 で指定できます。

列にデータポリシーを付与する

作成したデータポリシーを ALTER COLUMN SET OPTIONS で列に直接付与します。

email 列

ALTER TABLE datapolicy_work.users
ALTER COLUMN email SET OPTIONS (
  data_policies += ["{'name':'region-asia-northeast1.email_mask_policy'}"]
);

クエリ結果に「このステートメントでテーブル users が変更されました。」と表示されました。

bigquery-column-data-policy_04.png

同様に、birthday 列と postcode 列にもデータポリシーを付与します。

birthday 列

ALTER TABLE datapolicy_work.users
ALTER COLUMN birthday SET OPTIONS (
  data_policies += ["{'name':'region-asia-northeast1.birthday_mask_policy'}"]
);

postcode 列

ALTER TABLE datapolicy_work.users
ALTER COLUMN postcode SET OPTIONS (
  data_policies += ["{'name':'region-asia-northeast1.postcode_mask_policy'}"]
);

3 列すべてに付与が完了しました。
スキーマタブを確認すると、各列の「データポリシー」にポリシー名が表示されています。

bigquery-column-data-policy_05.png

警告アイコンにカーソルを合わせると「この列のデータへのアクセスを、接続されたデータポリシーによって制限しています。」と表示されます。
データポリシーによるアクセス制限が有効になっていることが分かりますね。

bigquery-column-data-policy_06.png

ちなみに、データポリシーを外す場合は = で空配列を指定します。
今回は 1 列に 1 つのデータポリシーを付与しましたが、最大 8 個まで関連付けできます。

ALTER TABLE datapolicy_work.users
ALTER COLUMN email SET OPTIONS (data_policies = []);

また、新規テーブル作成時は CREATE TABLE の列定義で OPTIONS (data_policies=[...]) を指定することもできます。

動作確認

データポリシー付与直後の状態

まず、マスクされたデータの閲覧権限も付与していない状態での挙動を確認しました。

プレビュータブでは、データポリシーが付いた birthdayemailpostcode 列が表示されなくなっています。

bigquery-column-data-policy_07.png

SELECT * を実行すると、Access Denied エラーになりました。

bigquery-column-data-policy_08.png

データポリシーが付いていない idname のみを SELECT すれば、通常どおり取得できました。

bigquery-column-data-policy_09.png

データポリシーが付いた列は、マスクされたデータの閲覧権限がないとアクセスできないようです。

マスクされたデータの閲覧権限を付与してマスク結果を確認

データポリシーに対して、マスクされたデータの閲覧権限を付与します。

今回は BigQuery Data Policy API(v2)の addGrantees を使って付与しました。

リクエストパラメータの dataPolicyprojects/{projectNumber}/locations/{locationId}/dataPolicies/{dataPolicyId} 形式で対象のデータポリシーを指定し、リクエストボディの grantees に権限を付与するプリンシパル(今回は Google アカウントなので principal://goog/subject/USER_EMAIL_ADDRESS 形式)を指定して実行します。

レスポンス(200)にはデータポリシーの情報と、追加された grantees が返されました。

bigquery-column-data-policy_10.png

マスクされたデータの閲覧権限を付与した状態で SELECT * を実行すると、マスクされたデータが表示されました。

bigquery-column-data-policy_11.png

birthday は年マスク(月日が 01-01 に置き換え)、email は電子メールマスク(ドメイン部分以外が XXXXX に置き換え)、postcode はカスタムルーティンにより数字が X に置き換わっています。
前回記事でポリシータグを使った場合と同じマスキング結果が得られました!

まとめ

以上、BigQuery でデータポリシーを列に直接関連付ける機能を試してみました。

前回記事ではタクソノミー作成、ポリシータグ作成、データポリシー紐付け、列にポリシータグ設定と複数のステップが必要でしたが、今回はデータポリシーを作成して列に直接付与するだけで、同じマスキング結果を得ることができました。
タクソノミーやポリシータグの準備が不要な分、手順がシンプルです。

前回記事(ポリシータグ方式)と今回の方式の違いを改めてまとめます。

観点 従来の方式(ポリシータグ) 今回の方式(列に直接データポリシー)
必要なリソース タクソノミー、ポリシータグ、データポリシー データポリシーのみ
手順 タクソノミー作成 → ポリシータグ作成 → データポリシーをタグに紐付け → 列にポリシータグ設定 データポリシー作成 → 列にデータポリシーを直接付与
列への関連付け ポリシータグを経由 データポリシーを直接指定

使い分けとしては、タクソノミーで機密レベルを階層管理したい場合や、同じタグを多くのテーブル・列で使い回したい場合はポリシータグが向いています。
一方、特定の列にマスキングを付けたいだけであれば、今回の列に直接データポリシーを付与する方式が手軽です。

なお、列へのデータポリシー直接付与にはいくつかの制限事項があります(対象テーブルの種類、ポリシータグとの併用不可など)。
利用前に公式ドキュメントをご確認ください。

列レベルのマスキングをサクッと試したいときの選択肢が増えたのは嬉しいですね!

参考リンク

この記事をシェアする

FacebookHatena blogX

関連記事