【正解】A
【0からの解説】
①前提知識:BigQuery では、テーブル単位・データセット単位の IAM に加えて、より細かいアクセス制御が用意されています。
・列レベルのセキュリティ:「ポリシータグ」を階層構造(タクソノミー)で定義し、テーブルの列に付けます。そのポリシータグに対して「きめ細かい読み取り(Fine-Grained Reader)」ロールを持つユーザーやグループだけが、その列の値を読み取れます。同じタグを多数のテーブルの列に付ければ、アクセス方針を一元的に適用できます(権限のないユーザーにマスクした値を返す動的データ マスキングも組み合わせられます)。
・行レベルのセキュリティ:行アクセス ポリシーにより、条件に合う「行」だけを特定のユーザーに見せる仕組みです。
②要件の整理:(1) 1 つのテーブルに医療データ列と財務データ列が同居する、(2) 臨床研究者には医療データの列のみ(財務列は不可)、(3) 経理チームには財務データの列と最小限の患者識別子の列のみ、(4) 「スケーラブル」=データ量や利用者、テーブルが増えても管理が破綻しない方法。どの患者の行も両チームが参照する前提なので、分けたいのは「行」ではなく「列(属性)」です。
③正解の理由:列レベルのセキュリティなら、例えば「医療」「財務」「患者識別子(機微)」といったポリシータグを列に付け、臨床研究者グループには医療タグ、経理グループには財務タグと必要最小限の識別子列のタグだけを許可する、という形で 1 つのテーブルのまま要件を満たせます。データを複製せず、新しいテーブルや列が増えてもタグを付けるだけで同じ方針が適用されるため、スケーラブルで管理しやすいガバナンスになります。
【誤りの選択肢】
B:用途別にテーブルを分割すると、同じデータを複数のテーブルに分けて持つための ETL と同期処理が必要になり、不整合のリスクや運用負荷が増えます。利用部門や組み合わせが増えるたびにテーブルが増えるため、スケーラブルではありません。
C:行レベルのセキュリティは「どの行を見せるか」を制御する機能です。今回の要件は同じ患者の行の中で医療の列と財務の列を出し分けることなので、行のフィルタでは実現できません。
D:承認済みビューでも、ビューごとに公開する列を選べば似たことは可能です。しかしチームごとにデータセットとビューを作成・維持する必要があり、テーブルのスキーマ変更や利用部門の追加のたびにビューを修正しなければなりません。列単位の制御はポリシータグによる列レベルのセキュリティで一元管理するほうがスケーラブルで、ビューの管理の手間が増える分だけ A に劣ります。
【参考】
安全な BigQuery データ ウェアハウスにデータをインポートする列へのアクセスを制御する | Dataform