このドキュメントでは、BigQuery で承認済みビューを作成する方法について説明します。
BigQuery で承認済みビューを作成するには、次の方法で作成します。
- Cloud Console を使用する。
bq
コマンドライン ツールのbq mk
コマンドを使用する。tables.insert
API メソッドを呼び出すCREATE VIEW
データ定義言語(DDL)ステートメントを送信する。- クライアント ライブラリを使用する。
概要
データセットに表示アクセス権を設定する場合、BigQuery では承認済みのビューを作成します。承認済みビューを使用すると、元のソースデータへのアクセス権がないユーザーでも、クエリの結果を特定のユーザーやグループと共有できます。ビューの SQL クエリを使用して、ユーザーがクエリを実行できる列(フィールド)を制限することもできます。
別のデータセットで承認済みビューを作成する場合、ソース データセットと承認済みビューのデータセットの両方が同じリージョン ロケーションに存在する必要があります。
承認済みビューの作成に関するチュートリアルについては、承認済みビューの作成をご覧ください。
必要な権限
承認済みビューを作成および更新するには、ビューを含むデータセットに対する権限と、ビューへのアクセス権を提供するデータセットに対する権限が必要です。
ビューを含むデータセット
ビューは BigQuery でテーブル リソースとして扱われるため、ビューを作成するにはテーブルの作成と同じ権限が必要です。ビューを作成するユーザーには、少なくとも bigquery.tables.create
権限が付与されている必要があります。次の定義済みの IAM ロールには bigquery.tables.create
権限が含まれています。
bigquery.dataEditor
bigquery.dataOwner
bigquery.admin
また、bigquery.datasets.create
権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner
アクセス権がユーザーに付与されます。bigquery.dataOwner
アクセス権により、データセットに含まれるビューの作成が許可されます。
BigQuery での IAM のロールと権限について詳しくは、事前定義ロールと権限をご覧ください。
ビューへのアクセス権を提供するデータセット
データセット プロパティを更新するユーザーには、少なくとも bigquery.datasets.update
および bigquery.datasets.get
権限が付与されている必要があります。次の定義済みの IAM ロールには bigquery.datasets.update
権限と bigquery.datasets.get
権限が含まれています。
bigquery.dataOwner
bigquery.admin
また、bigquery.datasets.create
権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner
アクセス権がユーザーに付与されます。bigquery.dataOwner
アクセス権により、自身が作成したデータセット プロパティの更新が許可されます。
BigQuery での IAM ロールと権限の詳細については、アクセス制御をご覧ください。
データセットに表示アクセス権を付与する
データセットへの表示アクセス権を付与するには:
Console
ナビゲーション パネルの [リソース] セクションでプロジェクトを展開し、データセットを選択します。
ウィンドウの右側にある [共有データセット] をクリックします。
[データセットの権限] パネルで、[承認済みのビュー] タブを選択します。
[承認済みビューの共有] セクションで、次の操作を行います。
- [プロジェクトの選択] で、プロジェクト名を確認します。ビューが異なるプロジェクトにある場合には、そのプロジェクトを選択します。
- [データセットを選択] で、ビューを含むデータセットを選択します。
- [ビューを選択] で、承認するビューを選択します。
[追加] をクリックしてから [完了] をクリックします。
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]" } } ], }
編集が完了したら、
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
次のステップ
- 承認済みビューの作成に関するチュートリアルについては、承認済みビューの作成をご覧ください。
- ビューの作成方法については、ビューの作成をご覧ください。
- ビューの一覧表示の詳細については、ビューの一覧表示をご覧ください。
- ビューのメタデータを取得する方法については、ビューの情報の取得をご覧ください。
- ビューを更新する方法については、ビューの更新をご覧ください。
- ビューの管理の詳細については、ビューの管理をご覧ください。