他の BigQuery 機能での行レベルのセキュリティの使用

このドキュメントでは、他の BigQuery 機能で行レベルのアクセス セキュリティを使用する方法について説明します。

このドキュメントを読む前に、BigQuery の行レベルのセキュリティの概要および行レベルのセキュリティの操作をお読みになり、行レベルのセキュリティを理解してください。

TRUE フィルタ

行レベルのアクセス ポリシーを使用すると、クエリの実行時にユーザーに表示される結果データをフィルタできます。DML などのクエリ以外のオペレーションを実行するには、テーブル内のすべての行に対する完全アクセス権が必要です。完全アクセス権は、フィルタ式を TRUE に設定した行アクセス ポリシーを使用することで付与されます。この行レベルのアクセス ポリシーは TRUE フィルタと呼ばれます。

TRUE フィルタのアクセス権は、どのユーザー(サービス アカウントを含む)にも付与できます。

クエリ以外のオペレーションの例を次に示します。

TRUE フィルタの例

CREATE ROW ACCESS POLICY all_access ON project.dataset.table1
GRANT TO ("group:all-rows-access@example.com")
FILTER USING (TRUE);

TRUE フィルタと連携する機能

行アクセス ポリシーで保護されたテーブルに対して DML オペレーションを使用する場合は、テーブル全体へのアクセスを意味する TRUE フィルタを使用する必要があります。テーブル スキーマを変更しないオペレーションでは、テーブルの行アクセス ポリシーが維持されます。

たとえば、ALTER TABLE RENAME TO ステートメントでは、元のテーブルから新しいテーブルに行アクセス ポリシーがコピーされます。別の例として、TRUNCATE TABLE ステートメントではテーブルからすべての行が削除されますが、テーブル スキーマと行アクセス ポリシーは維持されます。

コピージョブ

1 つ以上の行レベルのアクセス ポリシーを使用してテーブルをコピーするには、まず、ソーステーブルに対する TRUE フィルタへのアクセス権が付与されている必要があります。ソーステーブルに対するすべての行レベルのアクセス ポリシーも、新しい宛先テーブルにコピーされます。行レベルのアクセス ポリシーのないソーステーブルを、行レベルのアクセス ポリシーがある宛先テーブルにコピーすると、行レベルのアクセス ポリシーは宛先テーブルから削除されます(--append_table フラグが使用されている場合や、"writeDisposition": "WRITE_APPEND" が設定されている場合を除く)。

リージョン間のコピーは許可され、すべてのポリシーがコピーされます。サブクエリ ポリシーで無効なテーブル参照がクエリに含まれている場合、コピーが完了した後に後続のクエリが機能しない可能性があります。

テーブルの行レベルのアクセス ポリシーには一意の名前を付ける必要があります。コピー中に行レベルのアクセス ポリシー名が競合すると入力エラーが発生します。

行レベルのアクセス ポリシーが適用されたテーブルをコピーするために必要な権限

1 つ以上の行レベルのアクセス ポリシーが適用されたテーブルをコピーするには、テーブルとパーティションをコピーするロールに加えて、次の権限が必要です。

権限 リソース
bigquery.rowAccessPolicies.list ソーステーブル。
bigquery.rowAccessPolicies.getIamPolicy ソーステーブル。
TRUE フィルタ ソーステーブル。
bigquery.rowAccessPolicies.create 宛先テーブル。
bigquery.rowAccessPolicies.setIamPolicy 宛先テーブル。

BigQuery API の tabledata.list

行レベルのアクセス ポリシーが適用されたテーブルに対して BigQuery API の tabledata.list メソッドを使用するには、TRUE フィルタのアクセス権が必要です。

DML

行レベルのアクセス ポリシーを持つテーブルを更新する DML ステートメントを実行するには、テーブルに対する TRUE フィルタのアクセス権が必要です。

特に、MERGE ステートメントは、行レベルのアクセス ポリシーと次のように相互作用します。

  • ターゲット テーブルに行レベルのアクセス ポリシーが含まれている場合は、ターゲット テーブルに対する TRUE フィルタのアクセス権が必要です。
  • ソーステーブルに行レベルのアクセス ポリシーが含まれている場合、MERGE ステートメントはユーザーに表示される行でのみ機能します。

テーブル スナップショット

テーブル スナップショットは、行レベルのセキュリティをサポートします。ベーステーブル(ソーステーブル)とテーブル スナップショット(宛先テーブル)に必要な権限については、行レベルのアクセス ポリシーが適用されたテーブルをコピーするために必要な権限で説明しています。

JSON 列を含む BigQuery テーブル

行レベルのアクセス ポリシーを JSON 列に適用することはできません。行レベルのセキュリティに関する制限事項の詳細については、制限事項をご覧ください。

実行グラフ

行レベルのアクセス ポリシーが適用されたジョブには、クエリ実行グラフを使用できません。

ジョブを抽出する

テーブルに行レベルのアクセス ポリシーがある場合、抽出ジョブを実行すると、表示できるデータのみが Cloud Storage にエクスポートされます。

パーティション分割テーブルとクラスタ化テーブル

行レベルのセキュリティは、パーティション分割テーブルの機能であるクエリのプルーニングには関与しません。

行レベルのセキュリティはパーティション分割テーブルやクラスタ化されたテーブルと互換性がありますが、行データをフィルタする行レベルのアクセス ポリシーは、パーティションのプルーニング中は適用されません。パーティション列で実行される WHERE 句を指定することで、行レベルのセキュリティを使用するテーブルでもパーティションのプルーニングを使用できます。同様に、行レベルのアクセス ポリシー自体は、クラスタ化テーブルに対するクエリのパフォーマンス上のメリットをもたらしませんが、適用する他のフィルタの妨げになることはありません。

クエリのプルーニングは、ポリシーでフィルタを使用して行レベルのアクセス ポリシーを実行する際に行われます。

テーブルの名前を変更する

複数の行アクセス ポリシーを含むテーブルの名前を変更する場合、TRUE フィルタのアクセス権は必要ありません。テーブル名は DDL ステートメントで変更できます。

また、テーブルをコピーして宛先テーブルに別の名前を付けることもできます。ソーステーブルに行レベルのアクセス ポリシーが存在する場合の詳細については、このページのテーブルコピー ジョブをご覧ください。

ストリーミング更新

変更データ キャプチャを使用してストリーミング テーブルの UPDATE または DELETE オペレーションを実行するには、TRUE フィルタのアクセス権が必要です。

タイムトラベル

行レベルのアクセス ポリシーがある、または以前に存在していたテーブルの過去のデータにアクセスできるのは、テーブル管理者のみです。他のユーザーが行レベルのアクセス ポリシーがあるテーブルでタイムトラベル デコレータを使用すると、access denied エラーが発生します。詳細については、タイムトラベルと行レベルのアクセスをご覧ください。

論理ビュー、マテリアライズド ビュー、承認済みビュー

このセクションでは、さまざまなタイプの BigQuery ビューと、それらのビューが行レベルのセキュリティとどのように連携するかについて説明します。

論理ビューまたはマテリアライズド ビュー

論理ビューまたはマテリアライズド ビューは、テーブルに対するクエリから構築されます。クエリ結果は通常、テーブルデータのサブセットになります。

どちらのタイプのビューでも、表示されるデータは基になるソーステーブルの行レベルのアクセス ポリシーに従ってフィルタされます。ただし、行レベルのアクセス ポリシーでビューまたはマテリアライズド ビューを参照することはできません。

マテリアライズド ビューのパフォーマンス

さらに、マテリアライズド ビューが、行レベルのアクセス ポリシーを持つ基になるテーブルから派生している場合、クエリのパフォーマンスはソーステーブルを直接クエリする場合と同じです。つまり、ソーステーブルに行レベルのセキュリティが適用された場合、ソーステーブルに対するクエリと比較して、マテリアライズド ビューに対するクエリとソーステーブルのクエリの一般的なパフォーマンス上のメリットはありません。

承認済みビュー

論理ビューまたはマテリアライズド ビューを承認することもできます。つまり、特定のユーザーまたはグループ(プリンシパル)とビューを共有できます。プリンシパルはビューに対してクエリを実行できますが、基になるテーブルにアクセスすることはできません。詳細については、承認済みビューをご覧ください。

ワイルドカード クエリ

行レベルのアクセス ポリシーが適用されたテーブルに対するワイルドカード クエリは、INVALID_INPUT エラーで失敗します。

次のステップ