ビューの作成と使用

このドキュメントでは、BigQuery でビューを作成して使用する方法について説明します。ビューを作成した後、以下のことができます。

  • ビューへのアクセスを制御する
  • ビューに関する情報を取得する
  • データセット内のビューを一覧表示する
  • メタテーブルを使用してビューのメタデータを取得する

ビューのプロパティの更新、ビューのコピー、ビューの削除など、ビューの管理の詳細については、ビューの管理をご覧ください。

ビューの作成

BigQuery では、以下のようにビューを作成できます。

  • BigQuery ウェブ UI またはコマンドライン ツールの bq mk コマンドを使用して、手動で作成する
  • プログラムで tables.insert API メソッドを呼び出して作成する
  • CREATE VIEW データ定義言語(DDL)ステートメントを送信して作成する

BigQuery でビューを作成する場合、ビュー名はデータセットごとに一意にする必要があります。ビュー名には次の制限があります。

  • 1,024 文字以内
  • 英字(大文字または小文字)、数字、アンダースコアだけが含まれている

必要な権限

ビューは BigQuery でテーブル リソースとして扱われるため、ビューを作成するにはテーブルの作成と同じ権限が必要です。ビューを作成するユーザーには、データセット レベルで WRITER アクセス権が付与されているか、bigquery.tables.create 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。事前定義されたプロジェクト レベルの IAM 役割のうち、bigquery.tables.create 権限を含むものは以下のとおりです。

また、bigquery.user 役割には bigquery.datasets.create 権限が含まれているため、bigquery.user 役割に割り当てられたユーザーは、自分が作成した任意のデータセット内にビューを作成できます。bigquery.user 役割に割り当てられているユーザーがデータセットを作成すると、そのユーザーには、作成したデータセットへの OWNER アクセス権が付与されます。 データセットへの OWNER アクセス権が付与されたユーザーは、そのデータセットと、そこに含まれるすべてのテーブルとビューを完全に制御できます。

BigQuery での IAM 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

ビューの作成

ビューを作成するには:

ウェブ UI

  1. クエリを実行した後、クエリ結果ウィンドウの [Save View] ボタンをクリックし、結果をビューとして保存します。

    ビューを保存

  2. [Save View] ダイアログで、次の操作を行います。

    • [Project] で、ビューを保存するプロジェクトを選択します。
    • [Dataset] で、ビューを格納するデータセットを選択します。ビューを含むデータセットと、そのビューによって参照されているテーブルを含むデータセットは、同じロケーションに存在する必要があります。
    • [Table ID] に、ビューの名前を入力します。

      [Save View] ダイアログ

    • [OK] をクリックします。

CLI

mk コマンドを使用して --view フラグを指定します。標準 SQL クエリを使用する場合は、--use_legacy_sql フラグを追加して false に設定します。オプションのパラメータには --expiration--description--label があります。

Google Cloud Storage またはローカル ファイルに格納されている外部のユーザー定義関数リソースをクエリで参照する場合は、--view_udf_resource フラグを使用してリソースを指定します。--view_udf_resource フラグはここでは説明しません。UDF の使用方法の詳細については、標準 SQL ユーザー定義関数をご覧ください。

デフォルト プロジェクト以外のプロジェクトにビューを作成する場合は、--project_id フラグを使用してプロジェクト ID を指定します。

bq mk --use_legacy_sql=false --view_udf_resource=[PATH_TO_FILE] --expiration [INTEGER] --description "[DESCRIPTION]" --label [KEY:VALUE, KEY:VALUE] --view '[QUERY]' --project_id [PROJECT_ID] [DATASET].[VIEW]

ここで

  • [PATH_TO_FILE] は、ビューで使用されるユーザー定義関数リソースとして読み込まれてすぐに評価されるコードファイルの URI またはローカル ファイル システムのパスです。フラグを繰り返して複数のファイルを指定します。
  • [INTEGER] は、ビューのデフォルトの存続期間(秒)です。最小値は 3,600 秒(1 時間)です。現在時刻にこの整数値を足した値が有効期限になります。ビューの作成時に有効期限を設定した場合、データセットのデフォルトのテーブル有効期限設定は無視されます。
  • [DESCRIPTION] はビューの説明であり、引用符で囲みます。
  • [KEY:VALUE] は、ラベルを表す Key-Value ペアです。カンマ区切りリストを使用して複数のラベルを入力できます。
  • [QUERY] は有効なクエリです。標準 SQL ビューの場合、クエリは `[PROJECT_ID].[DATASET].[TABLE]` 形式でテーブルとビューの参照にプロジェクト ID を含める必要があります。
  • [PROJECT_ID] はプロジェクト ID です(デフォルトのプロジェクトが構成されていない場合)。
  • [DATASET] は、プロジェクトのデータセットです。
  • [VIEW] は、作成するビューの名前です。

例:

デフォルト プロジェクトにある mydataset 内に myview という名前のビューを作成するには、次のコマンドを入力します。存続期間は 3,600 秒(1 時間)、説明は This is my view、ラベルは organization:development に設定されます。ビューの作成に使用されるクエリは、USA Name データ一般公開データセットのデータを照会します。

bq mk --use_legacy_sql=false --expiration 3600 --description "This is my view" --label organization:development --view 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC' mydataset.myview

myotherproject にある mydataset 内に myview という名前のビューを作成するには、次のコマンドを入力します。存続期間は 3,600 秒(1 時間)、説明は This is my view、ラベルは organization:development に設定されます。ビューの作成に使用されるクエリは、USA Name データ一般公開データセットのデータを照会します。

bq mk --use_legacy_sql=false --expiration 3600 --description "This is my view" --label organization:development --view 'SELECT name,number FROM `bigquery-public-data.usa_names.usa_1910_current` WHERE gender = "M" ORDER BY number DESC' --project_id myotherproject mydataset.myview

ビューを作成した後、ビューの有効期限説明ラベルを更新できます。

API

view プロパティを含むテーブル リソースを指定して、tables.insert メソッドを呼び出します。

Go

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
meta := &bigquery.TableMetadata{
	// This example shows how to create a view of the shakespeare sample dataset, which
	// provides word frequency information.  This view restricts the results to only contain
	// results for works that contain the "king" in the title, e.g. King Lear, King Henry V, etc.
	ViewQuery: "SELECT word, word_count, corpus, corpus_date FROM `bigquery-public-data.samples.shakespeare` WHERE corpus LIKE '%king%'",
}
if err := client.Dataset(datasetID).Table(tableID).Create(ctx, meta); err != nil {
	return err
}

Python

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()
# project = 'my-project'
# source_dataset_id = 'my_source_dataset'
# source_table_id = 'us_states'
# shared_dataset_ref = client.dataset('my_shared_dataset')

# This example shows how to create a shared view of a source table of
# US States. The source table contains all 50 states, while the view will
# contain only states with names starting with 'W'.
view_ref = shared_dataset_ref.table('my_shared_view')
view = bigquery.Table(view_ref)
sql_template = (
    'SELECT name, post_abbr FROM `{}.{}.{}` WHERE name LIKE "W%"')
view.view_query = sql_template.format(
    project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

print('Successfully created view at {}'.format(view.full_table_id))

ビューへのアクセスの制御

アクセス制御をビューに直接割り当てることはできません。ビューへのアクセスを制御するには、データセット レベルまたはプロジェクト レベルでアクセス制御を構成します。

データセット レベルのアクセス制御では、その特定のデータセット内のビューに対してユーザー、グループ、サービス アカウントが実行できるオペレーションを指定します。データセット レベルの権限のみを割り当てる場合は、プロジェクトへのアクセス権を与える基本の役割または事前定義されたプロジェクト レベルの役割(例: bigquery.user)も割り当てる必要があります。

個々のデータセットへのアクセス権を与える代わりに、プロジェクトのすべてのデータセット内のすべてのビューへの権限を与える事前定義されたプロジェクト レベルの IAM 役割を割り当てることができます。

また、IAM カスタム役割を作成することもできます。カスタム役割を作成する場合、付与する権限は、ユーザー、グループ、サービス アカウントにどのビュー オペレーションを許可するかによって異なります。

役割と権限の詳細については、以下をご覧ください。

ビューのクエリ

ビューに対するクエリは、テーブルに対するクエリと同じ方法で行います。ビューをクエリするために必要な権限も、テーブルをクエリするための権限と同じです。クエリの作成と送信の詳細については、BigQuery データのクエリの概要をご覧ください。

ビューの使用

ビューに関する情報の取得

ビューに関する情報を取得するには、BigQuery ウェブ UI または CLI の bq show コマンドを使用するか、API の tables.get メソッドを呼び出します。

必要な権限

ビューに関する情報を取得するユーザーには、データセットに対する READER 役割が割り当てられているか、bigquery.tables.get 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。プロジェクト レベルで bigquery.tables.get 権限が付与されているユーザーは、そのプロジェクト内のすべてのビューに関する情報を取得できます。事前定義されているプロジェクト レベルの IAM 役割のうち、bigquery.jobUserbigquery.user 以外の役割には、bigquery.tables.get 権限が含まれています。

また、bigquery.user 役割が割り当てられているユーザーには bigquery.datasets.create 権限もあります。そのため、bigquery.user 役割が割り当てられているユーザーは、自分が作成した任意のデータセット内のビューに関する情報を取得できます。bigquery.user 役割に割り当てられているユーザーがデータセットを作成すると、そのユーザーには、作成したデータセットへの OWNER アクセス権が付与されます。データセットへの OWNER アクセス権が付与されたユーザーは、そのデータセットと、そこに含まれるすべてのビューを完全に制御できます。

BigQuery での IAM 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

ビューの情報の取得

ビューに関する情報を取得するプロセスは、テーブルに関する情報を取得するプロセスと同じです。

ビューに関する情報を取得するには:

ウェブ UI

  1. データセットを展開します。

  2. ビュー名をクリックします。

  3. [Details] をクリックします。[View Details] ページには、ビューの説明、ビューの情報、およびビューを定義する SQL クエリが表示されます。

    詳細を表示

CLI

bq show コマンドを発行します。--format フラグを使用して出力を制御できます。デフォルト プロジェクト以外のプロジェクトにあるビューの情報を取得する場合は、[PROJECT_ID]:[DATASET] の形式でプロジェクト ID をデータセットに追加します。

bq show --format=prettyjson [PROJECT_ID]:[DATASET].[VIEW]

ここで

  • [PROJECT_ID] はプロジェクト ID です。
  • [DATASET] はデータセットの名前です。
  • [VIEW] はビューの名前です。

例:

デフォルト プロジェクトにある mydataset データセット内の myview に関する情報を表示するには、次のコマンドを入力します。

bq show --format=prettyjson mydataset.myview

myotherproject にある mydataset データセット内の myview に関する情報を表示するには、次のコマンドを入力します。

bq show --format=prettyjson myotherproject:mydataset.myview

API

tables.get メソッドを呼び出し、関連パラメータを指定します。

Go

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
view := client.Dataset(datasetID).Table(viewID)
meta, err := view.Metadata(ctx)
if err != nil {
	return err
}
fmt.Printf("View %s, query: %s\n", view.FullyQualifiedName(), meta.ViewQuery)

Python

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()
# shared_dataset_id = 'my_shared_dataset'

view_ref = client.dataset(shared_dataset_id).table('my_shared_view')
view = client.get_table(view_ref)  # API Request

# Display view properties
print('View at {}'.format(view.full_table_id))
print('View Query:\n{}'.format(view.view_query))

データセット内のビューの一覧表示

データセット内のビューを一覧表示するには、BigQuery ウェブ UI または CLI の bq ls コマンドを使用するか、API の tables.list メソッドを呼び出します。

必要な権限

データセット内のビューを一覧表示するユーザーには、データセットに対する READER 役割が割り当てられているか、bigquery.tables.list 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。プロジェクト レベルで bigquery.tables.list 権限が付与されているユーザーは、そのプロジェクトの任意のデータセット内のビューを一覧表示できます。事前定義された BigQuery の IAM 役割のうち、bigquery.jobUser 以外の役割には bigquery.tables.list 権限が含まれています。

BigQuery での IAM 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

ビューの一覧表示

ビューを一覧表示するプロセスは、テーブルを一覧表示するプロセスと同じです。

データセット内のビューを一覧表示するには:

ウェブ UI

  1. ウェブ UI のナビゲーション ペインで、データセットの左側にある青色の矢印をクリックして展開するか、データセット名をダブルクリックします。これにより、データセット内のテーブルとビューが表示されます。

  2. リストをスクロールして、データセット内のテーブルを表示します。テーブルとビューは別々のアイコンで識別されます。

    テーブルの表示

コマンドライン

bq ls コマンドを発行します。--format フラグを使用して出力を制御できます。デフォルト プロジェクト以外のプロジェクトにあるビューを一覧表示する場合は、[PROJECT_ID]:[DATASET] の形式でプロジェクト ID をデータセットに追加します。

bq ls --format=pretty [PROJECT_ID]:[DATASET]

ここで

  • [PROJECT_ID] はプロジェクト ID です。
  • [DATASET] はデータセットの名前です。

このコマンドを実行すると、Type フィールドに TABLE または VIEW が表示されます。次に例を示します。

+-------------------------+-------+----------------------+-------------------+
|         tableId         | Type  |        Labels        | Time Partitioning |
+-------------------------+-------+----------------------+-------------------+
| mytable                 | TABLE | department:shipping  |                   |
| myview                  | VIEW  |                      |                   |
+-------------------------+-------+----------------------+-------------------+

例:

デフォルト プロジェクトにある mydataset データセット内のビューを一覧表示するには、次のコマンドを入力します。

bq ls --format=pretty mydataset

myotherproject にある mydataset データセット内のビューを一覧表示するには、次のコマンドを入力します。

bq ls --format=pretty myotherproject:mydataset

API

API を使用してビューを一覧表示するには、tables.list メソッドを呼び出します。

Go

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Go の設定手順に従ってください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
ts := client.Dataset(datasetID).Tables(ctx)
for {
	t, err := ts.Next()
	if err == iterator.Done {
		break
	}
	if err != nil {
		return err
	}
	fmt.Fprintf(w, "Table: %q\n", t.TableID)
}

Python

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()
# dataset_ref = client.dataset('my_dataset')

tables = list(client.list_tables(dataset_ref))  # API request(s)
assert len(tables) == 0

table_ref = dataset.table('my_table')
table = bigquery.Table(table_ref)
client.create_table(table)                  # API request
tables = list(client.list_tables(dataset))  # API request(s)

assert len(tables) == 1
assert tables[0].table_id == 'my_table'

メタテーブルを使用したビューのメタデータの取得

BigQuery には、メタデータ(データセット内のテーブルやビューのリストなど)が格納された特別なテーブルがあります。これらの「メタテーブル」は読み取り専用です。データセット内のテーブルやビューに関するメタデータにアクセスするには、クエリの SELECT ステートメントで __TABLES_SUMMARY__ メタテーブルを使用します。クエリを実行するには、コンソール、従来の BigQuery ウェブ UI、コマンドライン ツールの bq query コマンドのいずれかを使用するか、jobs.insert API メソッドを呼び出してクエリジョブを構成します。

__TABLES_SUMMARY__ メタテーブルを使用するクエリは次のようになります。

    SELECT [FIELD] FROM [DATASET].__TABLES_SUMMARY__

ここで

  • DATASET はデータセットの名前です。
  • FIELD は以下のいずれかです。
説明
project_id プロジェクトの名前。
dataset_id データセットの名前。
table_id テーブルまたはビューの名前。
creation_time テーブルまたはビューが作成された時刻(UTC 1970 年 1 月 1 日からのミリ秒数)。
type テーブルの種類を表す整数。通常のテーブルは 1、ビューは 2。

必要な権限

__TABLES_SUMMARY__ メタテーブルを使用するクエリジョブを実行するには、bigquery.jobs.create 権限が必要です。次の定義済みのプロジェクト レベルの IAM 役割には bigquery.jobs.create 権限が含まれています。

また、ユーザーには、データセット レベルで READER 役割が付与されているか、bigquery.tables.getData 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。事前定義されたプロジェクト レベルの IAM 役割のうち、bigquery.userbigquery.jobUserbigquery.metadataViewer 以外の役割には、bigquery.tables.getData 権限が含まれています。

メタテーブルの制限事項

メタテーブルには以下の制限があります。

  • 一般に、__TABLES_SUMMARY__ の検索速度が実用的な速さになるのはデータセット内のテーブル数が数千以下の場合です。データセットのサイズがこれより大きくなると、__TABLES_SUMMARY__ の検索速度は徐々に遅くなり、使用可能なリソースを超過する可能性があります。
  • メタテーブルを tables.insert メソッドで使用することはできません。
  • メタテーブルを宛先テーブルとして使用することはできません。
  • メタテーブルは、レガシー SQL のテーブル デコレータをサポートしていません。
  • メタテーブルは、データセット内のテーブルのリストには表示されません。

メタテーブルの例

次のクエリは、bigquery-public-data.samples データセットのすべてのメタデータを取得します。

従来の UI

#standardSQL
SELECT
  *
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`

コマンドライン

bq --location=US query --use_legacy_sql=false '
SELECT
  *
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`'

出力は次のようになります。

+----------------------+------------+-----------------+---------------+------+
| project_id           | dataset_id |    table_id     | creation_time | type |
+----------------------+------------+-----------------+---------------+------+
| bigquery-public-data | samples    | github_nested   | 1348782587310 |    1 |
| bigquery-public-data | samples    | github_timeline | 1335915950690 |    1 |
| bigquery-public-data | samples    | gsod            | 1335916040125 |    1 |
| bigquery-public-data | samples    | natality        | 1335916045005 |    1 |
| bigquery-public-data | samples    | shakespeare     | 1335916045099 |    1 |
| bigquery-public-data | samples    | trigrams        | 1335916127449 |    1 |
| bigquery-public-data | samples    | wikipedia       | 1335916132870 |    1 |
+----------------------+------------+-----------------+---------------+------+

次のクエリは、bigquery-public-data.samples データセット内のすべてのテーブルとビューのリストを取得します。

従来の UI

#standardSQL
SELECT
  table_id
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`

コマンドライン

bq --location=US query --use_legacy_sql=false '
SELECT
  table_id
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`'

出力は次のようになります。

+-----------------+
|    table_id     |
+-----------------+
| github_nested   |
| github_timeline |
| gsod            |
| natality        |
| shakespeare     |
| trigrams        |
| wikipedia       |
+-----------------+

次のクエリは、bigquery-public-data.samples データセット内の各テーブルの種類のリストを取得します。

従来の UI

#standardSQL
SELECT
  table_id, type
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`

コマンドライン

bq --location=US query --use_legacy_sql=false '
SELECT
  table_id, type
FROM
  `bigquery-public-data.samples.__TABLES_SUMMARY__`'

出力は次のようになります。

+-----------------+------+
|    table_id     | type |
+-----------------+------+
| github_nested   |   1  |
| github_timeline |   1  |
| gsod            |   1  |
| natality        |   1  |
| shakespeare     |   1  |
| trigrams        |   1  |
| wikipedia       |   1  |
+-----------------+------+

データセットへの表示アクセス権の付与

データセットへの表示アクセス権を付与することは、「BigQuery で承認済みビューを作成する」とも呼ばれます。承認済みビューを使用すると、元のテーブルへのアクセス権がないユーザーでも、クエリの結果を特定のユーザーやグループと共有できます。ビューの SQL クエリを使用して、ユーザーがクエリを実行できる列(フィールド)を制限することもできます。

このようなビューは、ビューの元になるソースデータとは異なるデータセットに作成する必要があります。アクセス制御はデータセット レベルでのみ割り当てることができるため、ソースデータと同じデータセットにビューを作成した場合、ユーザーはビューとデータの両方にアクセスできてしまいます。

承認済みビューを作成するチュートリアルについては、BigQuery で承認済みビューを作成するをご覧ください。

必要な権限

データセットへの表示アクセス権を付与するユーザーには、データセット レベルで OWNER アクセス権が付与されているか、bigquery.datasets.update 権限を含むプロジェクト レベルの IAM 役割が割り当てられている必要があります。次の定義済みのプロジェクト レベルの IAM 役割には bigquery.datasets.update 権限が含まれます。

また、bigquery.user 役割には bigquery.datasets.create 権限が含まれているため、bigquery.user 役割に割り当てられたユーザーは、自分が作成した任意のデータセットを更新できます。bigquery.user 役割に割り当てられているユーザーがデータセットを作成すると、そのユーザーには、作成したデータセットへの OWNER アクセス権が付与されます。 データセットへの OWNER アクセス権が付与されたユーザーは、そのデータセットを完全に制御できます。

BigQuery での IAM 役割と権限の詳細については、アクセス制御をご覧ください。データセット レベルの役割の詳細については、データセットに対する基本の役割をご覧ください。

表示アクセス権の付与

データセットへの表示アクセス権を付与するには:

ウェブ UI

以下では、従来の BigQuery ウェブ UI を使用してデータセットにアクセス制御を割り当てる手順を説明します。現在、コンソールでアクセス制御を割り当てることはできません。
  1. ソーステーブルを含むデータセットの右側のプルダウン矢印をクリックし、[Share Dataset] を選択します。

  2. [Share Dataset] ダイアログの [Add People] で、フィールドの左側にプルダウンをクリックして、[Authorized View] を選択します。

  3. [Select View] をクリックします。

  4. [Select View] ダイアログで、次の操作を行います。

    • [Project] で、プロジェクト名を確認します。ビューが異なるプロジェクトにある場合には、そのプロジェクトを選択します。
    • [Dataset] で、ビューを含むデータセットを選択します。
    • [Table ID] で、承認するビューの名前を入力します。
    • [OK] をクリックします。

      承認済みビューを選択する

  5. [Add] をクリックして、[Save changes] をクリックします。

コマンドライン

  1. 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 ファイルに書き込まれます。mydatasetmyotherproject にあります。

      bq show --format=prettyjson myotherproject:mydataset > /tmp/mydataset.json

  2. 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]"
      }
     ],
    }
    

  3. 編集が完了したら、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 のアクセス制御が更新されます。mydatasetmyotherproject にあります。

      bq update --source /tmp/mydataset.json myotherproject:mydataset
      
  4. アクセス制御の変更を確認するには、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 のリファレンス ドキュメントをご覧ください。

// To run this sample, you will need to create (or reuse) a context and
// an instance of the bigquery client.  For example:
// import "cloud.google.com/go/bigquery"
// ctx := context.Background()
// client, err := bigquery.NewClient(ctx, "your-project-id")
srcDataset := client.Dataset(srcDatasetID)
viewDataset := client.Dataset(viewDatasetID)
view := viewDataset.Table(viewID)

// First, we'll add a group to the ACL for the dataset containing the view.  This will allow users within
// that group to query the view, but they must have direct access to any tables referenced by the view.
vMeta, err := viewDataset.Metadata(ctx)
if err != nil {
	return err
}
vUpdateMeta := bigquery.DatasetMetadataToUpdate{
	Access: append(vMeta.Access, &bigquery.AccessEntry{
		Role:       bigquery.ReaderRole,
		EntityType: bigquery.GroupEmailEntity,
		Entity:     "example-analyst-group@google.com",
	}),
}
if _, err := viewDataset.Update(ctx, vUpdateMeta, vMeta.ETag); err != nil {
	return err
}

// Now, we'll authorize a specific view against a source dataset, delegating access enforcement.
// Once this has been completed, members of the group previously added to the view dataset's ACL
// no longer require access to the source dataset to successfully query the view.
srcMeta, err := srcDataset.Metadata(ctx)
if err != nil {
	return err
}
srcUpdateMeta := bigquery.DatasetMetadataToUpdate{
	Access: append(srcMeta.Access, &bigquery.AccessEntry{
		EntityType: bigquery.ViewEntity,
		View:       view,
	}),
}
if _, err := srcDataset.Update(ctx, srcUpdateMeta, srcMeta.ETag); err != nil {
	return err
}

Python

このサンプルを試す前に、BigQuery クイックスタート: クライアント ライブラリの使用の Python の設定手順に従ってください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

# from google.cloud import bigquery
# client = bigquery.Client()

# Assign access controls to the dataset containing the view
# shared_dataset_id = 'my_shared_dataset'
# analyst_group_email = 'data_analysts@example.com'
shared_dataset = client.get_dataset(
    client.dataset(shared_dataset_id))  # API request
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry('READER', 'groupByEmail', analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ['access_entries'])  # API request

# Authorize the view to access the source dataset
# project = 'my-project'
# source_dataset_id = 'my_source_dataset'
source_dataset = client.get_dataset(
    client.dataset(source_dataset_id))  # API request
view_reference = {
    'projectId': project,
    'datasetId': shared_dataset_id,
    'tableId': 'my_shared_view',
}
access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, 'view', view_reference)
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ['access_entries'])  # API request

ビューを使用して行レベルのアクセスを適用する

ビューを使用して、特定の列(フィールド)へのアクセスを制限できます。テーブルの個々の行へのアクセスを制限する場合、ユーザーまたはグループごとに別々のビューを作成する必要はありません。その代わりに、SESSION_USER() 関数を使用して現在のユーザーのメールアドレスを取得できます。

ユーザーごとに異なる行を表示するには、行の表示を許可するユーザーを含むテーブルに別のフィールドを追加します。次に、SESSION_USER() 関数を使用するビューを作成します。次の例では、ユーザー名が allowed_viewer フィールドに格納されます。

#standardSQL
SELECT [COLUMN_1, COLUMN_2]
FROM `[DATASET.VIEW]`
WHERE allowed_viewer = SESSION_USER()

この方法では、1 回に複数のユーザーにアクセスを許可することはできません。この制限を回避するには、allowed_viewer を繰り返しフィールドにします。これにより、各行にユーザーリストを作成できます。ただし、繰り返しフィールドを使用する場合でも、テーブルにユーザー名を保存するときに、各行にアクセスする個々のユーザーを手動で設定しなければなりません。

代わりの方法としては、allowed_viewer フィールドにグループ名を入力し、グループとユーザーをマッピングする別のテーブルを作成します。グループとユーザーをマッピングするテーブルには、グループ名とユーザー名を保存するスキーマがあります。たとえば、{group:string, user_name:string} のようになります。これにより、データを含むテーブルとは別にユーザーとグループの情報を管理できます。

マッピングするテーブルの名前が private.access_control の場合、承認済みのビューを作成する SQL クエリは次のようになります。

#standardSQL
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

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。