承認済みビュー
このドキュメントでは、BigQuery で承認済みビューを作成する方法について説明します。
BigQuery で承認済みビューを作成するには、次の方法で作成します。
- コンソールの使用
bq update
コマンドを使用する。tables.patch
API メソッドを呼び出す。- クライアント ライブラリを使用する。
概要
承認済みビューを使用すると、元のソースデータへのアクセスを許可することなく、クエリの結果を特定のユーザーやグループと共有できます。ビューの SQL クエリを使用して、ユーザーがクエリを実行できる列(フィールド)を制限することもできます。
別のデータセットで承認済みビューを作成する場合、ソース データセットと承認済みビューのデータセットの両方が同じリージョン ロケーションに存在する必要があります。
承認済みビューの作成に関するチュートリアルについては、承認済みビューの作成をご覧ください。
個々のビューを承認するのではなく、データセット内のすべてのビューを承認する場合については、承認済みデータセットをご覧ください。
始める前に
このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(IAM)のロールを付与します。
必要な権限
承認済みビューを作成および更新するには、ビューを含むデータセットに対する権限と、ビューへのアクセス権を提供するデータセットに対する権限が必要です。
ビューを含むデータセットに対する権限
BigQuery では、ビューはテーブル リソースとして扱われます。このため、ビューを作成するには、テーブルの作成と同じ権限が必要になります。また、ビューの SQL クエリで参照されるテーブルにクエリを実行する権限も必要です。
ビューを作成するには、bigquery.tables.create
IAM 権限が必要です。
次の IAM 事前定義ロールには、ビューの作成に必要な権限が含まれています。
roles/bigquery.dataEditor
roles/bigquery.dataOwner
roles/bigquery.admin
bigquery.datasets.create
権限がある場合は、作成したデータセットにビューを作成できます。所有していないデータのビューを作成するには、そのテーブルに対する bigquery.jobs.create
権限が必要です。
BigQuery での IAM のロールと権限については、事前定義ロールと権限をご覧ください。
ビューへのアクセス権を提供するデータセットに対する権限
データセット プロパティを更新するには、次の IAM 権限が必要です。
bigquery.datasets.update
bigquery.datasets.get
次の各事前定義 IAM ロールには、データセットのプロパティを更新するために必要な権限が含まれています。
roles/bigquery.dataOwner
roles/bigquery.admin
また、bigquery.datasets.create
権限がある場合は、作成したデータセットのプロパティを更新できます。
BigQuery での IAM のロールと権限については、事前定義ロールと権限をご覧ください。
ビューを承認する
データセットへの表示アクセス権を付与するには:
Console
[エクスプローラ] パネルでプロジェクトを開いて、データセットを選択します。
[
アクション] オプションを開いて、[開く] をクリックします。詳細パネルで [共有データセット] をクリックします。
[データセットの権限] パネルで、[承認済みのビュー] タブを選択します。
[承認済みビューの共有] セクションで、次の操作を行います。
- [プロジェクトの選択] で、プロジェクト名を確認します。ビューが異なるプロジェクトにある場合には、そのプロジェクトを選択します。
- [データセットを選択] で、ビューを含むデータセットを選択します。
- [ビューを選択] で、承認するビューを選択します。
[追加] をクリックしてから [完了] をクリックします。
bq
bq show
コマンドを使用して、既存のデータセット情報(アクセス制御も含む)を JSON ファイルに書き込みます。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset
の形式でプロジェクト ID をデータセット名に追加します。bq show \ --format=prettyjson \ project_id:dataset > path_to_file
ここで
- project_id はプロジェクト ID です。
- dataset はデータセットの名前です。
- path_to_file は、ローカルマシン上の JSON ファイルへのパスです。
例:
次のコマンドを入力すると、
mydataset
のアクセス制御が JSON ファイルに書き込まれます。mydataset
はデフォルト プロジェクトにあります。bq show --format=prettyjson mydataset > /tmp/mydataset.json
次のコマンドを入力すると、
mydataset
のアクセス制御が JSON ファイルに書き込まれます。mydataset
はmyotherproject
にあります。bq show --format=prettyjson \ myotherproject:mydataset > /tmp/mydataset.json
JSON ファイルの access セクションに承認済みビューを追加します。
たとえば、データセットの JSON ファイルの access セクションは次のようになります。
{ "access": [ { "role": "READER", "specialGroup": "projectReaders" }, { "role": "WRITER", "specialGroup": "projectWriters" }, { "role": "OWNER", "specialGroup": "projectOwners" } { "role": "READER", "specialGroup": "allAuthenticatedUsers" } { "role": "READER", "domain": "[DOMAIN_NAME]" } { "role": "WRITER", "userByEmail": "[USER_EMAIL]" } { "role": "READER", "groupByEmail": "[GROUP_EMAIL]" }, { "view":{ "datasetId": "[DATASET_NAME]", "projectId": "[PROJECT_NAME]", "tableId": "[VIEW_NAME]" } } ], }
編集が完了したら、
bq update
コマンドを実行します。その際、--source
フラグを使用して JSON ファイルを指定します。データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset
の形式でプロジェクト ID をデータセット名に追加します。bq update \ --source path_to_file \ project_id:dataset
ここで
- path_to_file は、ローカルマシン上の JSON ファイルへのパスです。
- project_id は、プロジェクト ID です。
- dataset はデータセットの名前です。
例:
次のコマンドを入力すると、
mydataset
のアクセス制御が更新されます。mydataset
はデフォルト プロジェクトにあります。bq update --source /tmp/mydataset.json mydataset
次のコマンドを入力すると、
mydataset
のアクセス制御が更新されます。mydataset
はmyotherproject
にあります。bq update --source /tmp/mydataset.json myotherproject:mydataset
アクセス制御の変更を確認するには、
show
コマンドをもう一度入力します。ただし、今回は情報をファイルに書き込む指定を省略します。bq show --format=prettyjson [DATASET]
または
bq show --format=prettyjson [PROJECT_ID]:[DATASET]
API
datasets.patch
を呼び出し、access
プロパティを使用してアクセス制御を更新します。詳細については、データセットをご覧ください。
datasets.update
メソッドはデータセット リソース全体を置き換えます。そのため、アクセス制御の更新には datasets.patch
メソッドの方が適切です。
Go
このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Go の手順に沿って設定を行ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。
Java
このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用にある Java の設定手順を行ってください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。
Python
このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用にある Python の設定手順を行ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。
ビューを使用して行レベルのアクセスを適用する
ビューを使用して、特定の列(フィールド)へのアクセスを制限できます。テーブルの個々の行へのアクセスを制限する場合、ユーザーまたはグループごとに別々のビューを作成する必要はありません。その代わりに、SESSION_USER()
関数を使用して現在のユーザーのメールアドレスを取得できます。
ユーザーごとに異なる行を表示するには、行の表示を許可するユーザーを含むテーブルに別のフィールドを追加します。次に、SESSION_USER()
関数を使用するビューを作成します。次の例では、ユーザー名が allowed_viewer
フィールドに格納されます。
SELECT COLUMN_1, COLUMN_2 FROM `dataset.view` WHERE allowed_viewer = SESSION_USER()
この方法では、複数のユーザーに一度にアクセスを許可することはできません。この制限を回避するには、allowed_viewer
を繰り返しフィールドにします。これにより、各行に対してユーザーのリストを指定できます。ただし、繰り返しフィールドを使用する場合でも、テーブルにユーザー名を保存するときに、各行にアクセスする個々のユーザーを手動で設定しなければなりません。
別の方法として、allowed_viewer
フィールドにグループ名を入力し、グループとユーザーをマッピングする別のテーブルを作成することもできます。グループとユーザーをマッピングするテーブルには、グループ名とユーザー名を保存するスキーマがあります。例: {group:string, user_name:string}
。これにより、データを含むテーブルとは別にユーザーとグループの情報を管理できます。
マッピングするテーブルの名前が private.access_control
の場合、承認済みのビューを作成する SQL クエリは次のようになります。
SELECT c.customer, c.id FROM `private.customers` c INNER JOIN ( SELECT group FROM `private.access_control` WHERE SESSION_USER() = user_name) g ON c.allowed_group = g.group
次のステップ
- 承認済みビューの作成に関するチュートリアルについては、承認済みビューの作成をご覧ください。
- ビューの作成方法については、ビューの作成をご覧ください。
- ビューの一覧表示の詳細については、ビューの一覧表示をご覧ください。
- ビューのメタデータを取得する方法については、ビューの情報の取得をご覧ください。
- ビューを更新する方法については、ビューの更新をご覧ください。
- ビューの管理の詳細については、ビューの管理をご覧ください。
- データセット内のすべてのビューの承認については、承認済みデータセットをご覧ください。