承認済みビューを作成する

このチュートリアルでは、データ アナリストが使用する承認済みビューを BigQuery で作成します。承認済みのビューを使用すると、元のソースデータへのアクセス権を付与することなく、特定のユーザーやグループとの間でクエリ結果を共有できます。ビューには、ユーザーまたはグループではなくソースデータへのアクセス権が付与されます。ビューの SQL クエリを使用して、クエリ結果から列とフィールドを除外することもできます。

承認済みビューを使用する別の方法として、ソースデータに列レベルのアクセス制御を設定し、アクセス制御されたデータをクエリするビューへのアクセス権をユーザーに付与することもできます。列レベルのアクセス制御の詳細については、列レベルのアクセス制御の概要をご覧ください。

同じソース データセットにアクセスする承認済みビューが複数ある場合は、個々のビューを承認する代わりに、ビューを含むデータセットを承認できます。

ソースデータを保存するデータセットを作成する

まず、ソースデータを格納するデータセットを作成します。

ソース データセットを作成するには、次のいずれかのオプションを選択します。

コンソール

  1. [BigQuery] ページに移動します。

    BigQuery に移動

  2. 左側のペインで、 [エクスプローラ] をクリックします。

    エクスプローラ ペインのボタンがハイライト表示されている。

    左側のペインが表示されていない場合は、 左側のペインを開くをクリックしてペインを開きます。

  3. [エクスプローラ] ペインで、データセットを作成するプロジェクトの横にある [アクションを表示] > [データセットを作成] をクリックします。

  4. [データセットを作成する] ページで、次の操作を行います。

    1. [データセット ID] に「github_source_data」と入力します。

    2. [ロケーション タイプ] で、[マルチリージョン] が選択されていることを確認します。

    3. [マルチリージョン] で、US または EU を選択します。このチュートリアルで作成するすべてのリソースは、同じマルチリージョン ロケーションに配置する必要があります。

    4. [データセットを作成] をクリックします。

SQL

CREATE SCHEMA DDL ステートメントを使用します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE SCHEMA github_source_data;

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

Java

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

// Create a source dataset to store your table. Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

Python

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

from google.cloud import bigquery from google.cloud.bigquery.enums import EntityTypes  client = bigquery.Client() source_dataset_id = "github_source_data" source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)   source_dataset = bigquery.Dataset(source_dataset_id_full) # Specify the geographic location where the dataset should reside. source_dataset.location = "US" source_dataset = client.create_dataset(source_dataset)  # API request

テーブルを作成してソースデータを読み込む

ソース データセットを作成したら、SQL クエリの結果を宛先テーブルに保存して、そのテーブルにデータを入力します。このクエリでは、GitHub 一般公開データセットからデータを取得します。

コンソール

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで以下のクエリを入力します。

    SELECT   commit,   author,   committer,   repo_name FROM   `bigquery-public-data.github_repos.commits` LIMIT   1000; 
  3. [展開] をクリックして、[クエリの設定] を選択します。

  4. [送信先] で [クエリ結果の宛先テーブルを設定する] をオンにします。

  5. [データセット] に「PROJECT_ID.github_source_data」と入力します。

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  6. [テーブル ID] に「github_contributors」と入力します。

  7. [保存] をクリックします。

  8. [実行] をクリックします。

  9. クエリが完了したら、[エクスプローラ] ペインで [データセット] をクリックし、github_source_data データセットをクリックします。

  10. [概要 > テーブル] をクリックし、github_contributors テーブルをクリックします。

  11. データがテーブルに書き込まれたことを確認するには、[プレビュー] タブをクリックします。

Java

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

// Populate a source table String tableQuery =     "SELECT commit, author, committer, repo_name"         + " FROM `bigquery-public-data.github_repos.commits`"         + " LIMIT 1000"; QueryJobConfiguration queryConfig =     QueryJobConfiguration.newBuilder(tableQuery)         .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))         .build(); bigquery.query(queryConfig);

Python

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

source_table_id = "github_contributors" job_config = bigquery.QueryJobConfig() job_config.destination = source_dataset.table(source_table_id) sql = """     SELECT commit, author, committer, repo_name     FROM `bigquery-public-data.github_repos.commits`     LIMIT 1000 """ client.query_and_wait(     sql,     # Location must match that of the dataset(s) referenced in the query     # and of the destination table.     location="US",     job_config=job_config, )  # API request - starts the query and waits for query to finish

承認済みビューを格納するデータセットを作成する

ソース データセットを作成したら、データ アナリストと共有する承認済みビューを格納する新しい別のデータセットを作成します。後のステップで、ソース データセット内のデータへのアクセス権を承認済みビューに付与します。データ アナリストには承認済みビューへのアクセス権が付与されますが、ソースデータへの直接アクセス権は付与されません。

承認済みビューは、ソースデータとは別のデータセットで作成する必要があります。これにより、データのオーナーは元のデータへのアクセス権を同時に付与することなく、承認済みビューへのアクセス権を付与できます。ソース データセットと承認済みビューのデータセットは、同じリージョンのロケーションに存在する必要があります。

ビューを保存するデータセットを作成するには、次のいずれかのオプションを選択します。

コンソール

  1. [BigQuery] ページに移動します。

    BigQuery に移動

  2. 左側のペインで、 [エクスプローラ] をクリックします。

    エクスプローラ ペインのボタンがハイライト表示されている。

  3. [エクスプローラ] ペインで、データセットを作成するプロジェクトを選択します。

  4. [アクションを表示] オプションを開き、[データセットを作成] をクリックします。

  5. [データセットを作成する] ページで、次の操作を行います。

    1. [データセット ID] に「shared_views」と入力します。

    2. [ロケーション タイプ] で、[マルチリージョン] が選択されていることを確認します。

    3. [マルチリージョン] で、US または EU を選択します。このチュートリアルで作成するすべてのリソースは、同じマルチリージョン ロケーションに配置する必要があります。

    4. [データセットを作成] をクリックします。

SQL

CREATE SCHEMA DDL ステートメントを使用します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE SCHEMA shared_views;

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

Java

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

// Create a separate dataset to store your view Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

Python

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

shared_dataset_id = "shared_views" shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)   shared_dataset = bigquery.Dataset(shared_dataset_id_full) shared_dataset.location = "US" shared_dataset = client.create_dataset(shared_dataset)  # API request

新しいデータセットに承認済みビューを作成する

新しいデータセットに、承認用に使用するビューを作成します。このビューをデータ アナリストと共有します。このビューは SQL クエリで作成します。このクエリで、データ アナリストに見せない列を除外します。

github_contributors ソーステーブルには、RECORD 型の 2 つのフィールド(authorcommitter)があります。このチュートリアルでは、承認済みビューから作成者の名前を除き、作成者のデータはすべて除外します。また、実行者の名前を除き、実行者のデータもすべて除外します。

新しいデータセットにビューを作成するには、次のいずれかのオプションを選択します。

コンソール

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで、次のクエリを入力します。

    SELECT commit, author.name AS author, committer.name AS committer, repo_name FROM `PROJECT_ID.github_source_data.github_contributors`;

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  3. [保存] > [ビューを保存] の順にクリックします。

  4. [ビューの保存] ダイアログで、次の操作を行います。

    1. [Project] で、必要なプロジェクトが選択されていることを確認します。

    2. [データセット] に「shared_views」と入力します。

    3. [テーブル] に「github_analyst_view」と入力します。

    4. [保存] をクリックします。

SQL

CREATE VIEW DDL ステートメントを使用します。

  1. Google Cloud コンソールで、[BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE VIEW shared_views.github_analyst_view AS (   SELECT     commit,     author.name AS author,     committer.name AS committer,     repo_name   FROM     `PROJECT_ID.github_source_data.github_contributors` );

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

Java

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

// Create the view in the new dataset String viewQuery =     String.format(         "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",         projectId, sourceDatasetId, sourceTableId);  ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);  Table view =     bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

Python

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

shared_view_id = "github_analyst_view" view = bigquery.Table(shared_dataset.table(shared_view_id)) sql_template = """     SELECT         commit, author.name as author,         committer.name as committer, repo_name     FROM         `{}.{}.{}` """ view.view_query = sql_template.format(     client.project, source_dataset_id, source_table_id ) view = client.create_table(view)  # API request

データ アナリストにクエリジョブを実行する権限を付与する

データ アナリストがビューにクエリを実行するには、クエリジョブを実行するための bigquery.jobs.create 権限と、ビューへのアクセス権が必要です。このセクションでは、データ アナリストに bigquery.user ロールを付与します。bigquery.user ロールには bigquery.jobs.create 権限が含まれています。後のステップで、データ アナリストにビューへのアクセス権を付与します。

プロジェクト レベルでデータ アナリストのグループを bigquery.user ロールに割り当てるには、次の操作を行います。

  1. Google Cloud コンソールで、[IAM] ページに移動します。

    [IAM] に移動

  2. プロジェクト セレクタでプロジェクトが選択されていることを確認します。

  3. [アクセス権を付与] をクリックします。

  4. [アクセス権を付与] ダイアログで、以下を行います。

    1. [新しいプリンシパル] フィールドに、データ アナリストを含むグループを入力します(例: [email protected])。

    2. [ロールを選択] フィールドで、[BigQuery ユーザー] ロールを検索して選択します。

    3. [保存] をクリックします。

承認済みビューにクエリを実行する権限をデータ アナリストに付与する

データ アナリストがビューにクエリを実行するには、データセット レベルまたはビューレベルで bigquery.dataViewer ロールが必要です。データセット レベルでこのロールを付与すると、アナリストはデータセット内のすべてのテーブルとビューにアクセスできるようになります。このチュートリアルで作成したデータセットには 1 つの承認済みビューが含まれているため、データセット レベルでアクセス権を付与することになります。アクセス権を付与する必要がある承認済みビューのコレクションがある場合は、代わりに承認済みデータセットの使用を検討してください。

データ アナリストに付与した bigquery.user ロールにより、クエリジョブの作成に必要な権限が付与されます。ただし、承認済みビューまたはビューを含むデータセットへの bigquery.dataViewer アクセス権がないと、ビューを正常にクエリすることはできません。

承認済みビューを含むデータセットに対する bigquery.dataViewer アクセス権をデータ アナリストに付与するには、次の操作を行います。

コンソール

  1. [BigQuery] ページに移動します。

    BigQuery に移動

  2. 左側のペインで、 [エクスプローラ] をクリックします。

    エクスプローラ ペインのボタンがハイライト表示されている。

  3. [エクスプローラ] ペインで、[データセット] をクリックし、shared_views データセットを選択して [詳細] タブを開きます。

  4. [共有] > [権限] の順にクリックします。

  5. [共有権限] ペインで、[プリンシパルを追加] をクリックします。

  6. [新しいプリンシパル] に、データ アナリストを含むグループを入力します(例: [email protected])。

  7. [ロールを選択] をクリックし、[BigQuery] > [BigQuery データ閲覧者] を選択します。

  8. [保存] をクリックします。

  9. [閉じる] をクリックします。

Java

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

// Assign access controls to the dataset containing the view List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl()); viewAcl.add(Acl.of(new Acl.Group("[email protected]"), Acl.Role.READER)); sharedDataset.toBuilder().setAcl(viewAcl).build().update();

Python

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

# analyst_group_email = '[email protected]' access_entries = shared_dataset.access_entries access_entries.append(     bigquery.AccessEntry("READER", EntityTypes.GROUP_BY_EMAIL, analyst_group_email) ) shared_dataset.access_entries = access_entries shared_dataset = client.update_dataset(     shared_dataset, ["access_entries"] )  # API request

ソース データセットの表示アクセスを承認する

承認済みビューを含むデータセットのアクセス制御を作成したら、承認済みビューにソース データセットへのアクセス権を付与します。この承認により、ビューはソースデータにアクセスできますが、データ アナリスト グループはアクセスできません。

承認済みビューにソースデータへのアクセス権を付与するには、次のいずれかのオプションを選択します。

コンソール

  1. [BigQuery] ページに移動します。

    BigQuery に移動

  2. 左側のペインで、 [エクスプローラ] をクリックします。

    エクスプローラ ペインのボタンがハイライト表示されている。

  3. [エクスプローラ] ペインで、[データセット] をクリックし、github_source_data データセットを選択して [詳細] タブを開きます。

  4. [共有] > [ビューを承認] をクリックします。

  5. [承認済みビュー] ペインの [承認済みビュー] に PROJECT_ID.shared_views.github_analyst_view と入力します。

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  6. [承認を追加] をクリックします。

Java

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

// Authorize the view to access the source dataset List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl()); srcAcl.add(Acl.of(new Acl.View(view.getTableId()))); sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

access_entries = source_dataset.access_entries access_entries.append(     bigquery.AccessEntry(None, EntityTypes.VIEW, view.reference.to_api_repr()) ) source_dataset.access_entries = access_entries source_dataset = client.update_dataset(     source_dataset, ["access_entries"] )  # API request

構成を確認する

構成が完了すると、データ アナリスト グループ(たとえば、data_analysts)のメンバーがビューにクエリを実行して、構成を確認できます。

構成を確認するには、データ アナリストは次のクエリを実行する必要があります。

  1. [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    SELECT   * FROM   `PROJECT_ID.shared_views.github_analyst_view`;

    PROJECT_ID は、実際のプロジェクト ID に置き換えます。

  3. [実行] をクリックします。

クエリの結果は次のようになります。結果には、作成者名とコミッター名のみが表示されます。

承認済みビューにクエリを実行した後のクエリ結果

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

完全なソースコード

次に、このチュートリアル用のソースコード全体を示します。

Java

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

// Create a source dataset to store your table. Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));  // Populate a source table String tableQuery =     "SELECT commit, author, committer, repo_name"         + " FROM `bigquery-public-data.github_repos.commits`"         + " LIMIT 1000"; QueryJobConfiguration queryConfig =     QueryJobConfiguration.newBuilder(tableQuery)         .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))         .build(); bigquery.query(queryConfig);  // Create a separate dataset to store your view Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));  // Create the view in the new dataset String viewQuery =     String.format(         "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",         projectId, sourceDatasetId, sourceTableId);  ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);  Table view =     bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));  // Assign access controls to the dataset containing the view List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl()); viewAcl.add(Acl.of(new Acl.Group("[email protected]"), Acl.Role.READER)); sharedDataset.toBuilder().setAcl(viewAcl).build().update();  // Authorize the view to access the source dataset List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl()); srcAcl.add(Acl.of(new Acl.View(view.getTableId()))); sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

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

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証情報を設定するをご覧ください。

# Create a source dataset from google.cloud import bigquery from google.cloud.bigquery.enums import EntityTypes  client = bigquery.Client() source_dataset_id = "github_source_data" source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)   source_dataset = bigquery.Dataset(source_dataset_id_full) # Specify the geographic location where the dataset should reside. source_dataset.location = "US" source_dataset = client.create_dataset(source_dataset)  # API request  # Populate a source table source_table_id = "github_contributors" job_config = bigquery.QueryJobConfig() job_config.destination = source_dataset.table(source_table_id) sql = """     SELECT commit, author, committer, repo_name     FROM `bigquery-public-data.github_repos.commits`     LIMIT 1000 """ client.query_and_wait(     sql,     # Location must match that of the dataset(s) referenced in the query     # and of the destination table.     location="US",     job_config=job_config, )  # API request - starts the query and waits for query to finish  # Create a separate dataset to store your view shared_dataset_id = "shared_views" shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)   shared_dataset = bigquery.Dataset(shared_dataset_id_full) shared_dataset.location = "US" shared_dataset = client.create_dataset(shared_dataset)  # API request  # Create the view in the new dataset shared_view_id = "github_analyst_view" view = bigquery.Table(shared_dataset.table(shared_view_id)) sql_template = """     SELECT         commit, author.name as author,         committer.name as committer, repo_name     FROM         `{}.{}.{}` """ view.view_query = sql_template.format(     client.project, source_dataset_id, source_table_id ) view = client.create_table(view)  # API request  # Assign access controls to the dataset containing the view # analyst_group_email = '[email protected]' access_entries = shared_dataset.access_entries access_entries.append(     bigquery.AccessEntry("READER", EntityTypes.GROUP_BY_EMAIL, 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 access_entries = source_dataset.access_entries access_entries.append(     bigquery.AccessEntry(None, EntityTypes.VIEW, view.reference.to_api_repr()) ) source_dataset.access_entries = access_entries source_dataset = client.update_dataset(     source_dataset, ["access_entries"] )  # API request