データセットのプロパティの更新

このドキュメントでは、BigQuery でデータセット プロパティを更新する方法について説明します。データセットを作成したら、次のデータセット プロパティを更新できます。

必要な権限

データセット プロパティを更新するユーザーには、少なくとも bigquery.datasets.update および bigquery.datasets.get 権限が付与されている必要があります。bigquery.datasets.update 権限と bigquery.datasets.get 権限は、事前定義された以下の Cloud IAM の役割に含まれています。

  • bigquery.dataOwner
  • bigquery.admin

また、bigquery.datasets.create 権限を持つユーザーがデータセットを作成すると、そのデータセットに対する bigquery.dataOwner アクセス権がユーザーに付与されます。bigquery.dataOwner アクセス権により、自身が作成したデータセット プロパティの更新が許可されます。

BigQuery での Cloud IAM 役割と権限については、アクセス制御をご覧ください。

データセットの説明の更新

データセットの説明は次の方法で更新できます。

  • Cloud Console または従来の BigQuery ウェブ UI を使用する
  • bq update CLI コマンドを使用する
  • datasets.patch API メソッドを呼び出す
  • クライアント ライブラリを使用する

データセットの説明を更新するには:

Console

  1. [リソース] ペインで、データセットを選択します。

  2. [詳細] ページで、[説明] の横にある鉛筆アイコンをクリックして、説明テキストを編集します。

    クエリの設定

  3. ダイアログで、説明をボックスに入力するか、既存の説明を編集します。[更新] をクリックして、新しい説明テキストを保存します。

従来の UI

  1. ナビゲーション ペインでデータセットを選択します。

  2. [Dataset Details] ページの [Description] セクションで、[Describe this dataset] をクリックして説明ボックスを開きます(そのデータセットに説明がない場合)。すでに説明がある場合は、そのテキストをクリックします。

  3. 説明をボックスに入力するか、既存の説明を編集します。ボックスの外側をクリックすると、テキストが保存されます。

    データセットの説明

CLI

--description フラグを指定して bq update コマンドを発行します。更新するデータセットがデフォルト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq update \
    --description "string" \
    project_id:dataset
    

ここで

  • string は、引用符で囲んだデータセットの説明テキストです。
  • project_id はプロジェクト ID です。
  • dataset は、更新するデータセットの名前です。

例:

mydataset の説明を「Description of mydataset」に変更するには、次のコマンドを入力します。mydataset はデフォルト プロジェクトにあります。

bq update --description "Description of mydataset" mydataset
    

mydataset の説明を「Description of mydataset」に変更するには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトではなく myotherproject にあります。

bq update \
    --description "Description of mydataset" \
    myotherproject:mydataset
    

API

datasets.patch を呼び出して、データセット リソースdescription プロパティを更新します。datasets.update メソッドはデータセット リソース全体を置き換えるため、datasets.patch メソッドの方が適切です。

Go

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

import (
    	"context"
    	"fmt"

    	"cloud.google.com/go/bigquery"
    )

    // updateDatasetDescription demonstrates how the Description metadata of a dataset can
    // be read and modified.
    func updateDatasetDescription(projectID, datasetID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()

    	ds := client.Dataset(datasetID)
    	meta, err := ds.Metadata(ctx)
    	if err != nil {
    		return err
    	}
    	update := bigquery.DatasetMetadataToUpdate{
    		Description: "Updated Description.",
    	}
    	if _, err = ds.Update(ctx, update, meta.ETag); err != nil {
    		return err
    	}
    	return nil
    }
    

Java

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

Dataset.toBuilder() メソッドを使用して、既存の Dataset インスタンスから Dataset.Builder インスタンスを作成します。データセット ビルダー オブジェクトを構成します。Dataset.Builder.build() メソッドを使用して、更新したデータセットを作成します。Dataset.update() メソッドを呼び出して API に更新を送信します。
import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Dataset;

    public class UpdateDatasetDescription {

      public static void runUpdateDatasetDescription() {
        // TODO(developer): Replace these variables before running the sample.
        String datasetName = "MY_DATASET_NAME";
        String newDescription = "this is the new dataset description";
        updateDatasetDescription(datasetName, newDescription);
      }

      public static void updateDatasetDescription(String datasetName, String newDescription) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

          Dataset dataset = bigquery.getDataset(datasetName);
          bigquery.update(dataset.toBuilder().setDescription(newDescription).build());
          System.out.println("Dataset description updated successfully to " + newDescription);
        } catch (BigQueryException e) {
          System.out.println("Dataset description was not updated \n" + e.toString());
        }
      }
    }

Node.js

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

// Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();

    async function updateDatasetDescription() {
      // Updates a dataset's description.

      // Retreive current dataset metadata
      const dataset = bigquery.dataset(datasetId);
      const [metadata] = await dataset.getMetadata();

      // Set new dataset description
      const description = 'New dataset description.';
      metadata.description = description;

      const [apiResponse] = await dataset.setMetadata(metadata);
      const newDescription = apiResponse.description;

      console.log(`${datasetId} description: ${newDescription}`);
    }

Python

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

Dataset.description プロパティを構成し、Client.update_dataset() を呼び出して API に更新を送信します。

    from google.cloud import bigquery

    # Construct a BigQuery client object.
    client = bigquery.Client()

    # TODO(developer): Set dataset_id to the ID of the dataset to fetch.
    # dataset_id = 'your-project.your_dataset'

    dataset = client.get_dataset(dataset_id)  # Make an API request.
    dataset.description = "Updated description."
    dataset = client.update_dataset(dataset, ["description"])  # Make an API request.

    full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
    print(
        "Updated dataset '{}' with description '{}'.".format(
            full_dataset_id, dataset.description
        )
    )

デフォルトのテーブル有効期限の更新

データセットのデフォルトのテーブル有効期限は、次の方法で更新できます。

  • Cloud Console または従来の BigQuery ウェブ UI を使用する
  • bq update CLI コマンドを使用する
  • datasets.patch API メソッドを呼び出す
  • クライアント ライブラリを使用する

データセット レベルでデフォルトのテーブルの有効期限を設定できます。また、テーブルの作成時にテーブルの有効期限を設定することもできます。テーブルの作成時に有効期限を設定した場合、データセット レベルで設定したデフォルトのテーブルの有効期限は無視されます。データセット レベルでデフォルトのテーブルの有効期限を設定せず、テーブルの作成時にもテーブルの有効期限を設定しなかった場合、テーブルは無期限に有効になります。このようなテーブルは手動で削除する必要があります。

データセットのデフォルトのテーブル有効期限設定を更新するときの規則は以下のとおりです。

  • 値を Never から有限の有効期限に変更する場合、そのデータセット内にすでに存在するテーブルが期限切れになることはありません(そのテーブルの作成時に有効期限が設定されている場合は除く)。
  • デフォルトのテーブル有効期限の値を変更する場合、すでに存在するテーブルの有効期限は変更前のテーブル有効期限の設定に従います。そのデータセット内に新規作成されたテーブルには、新しいテーブル有効期限設定が適用されます(ただし、そのテーブルの作成時に別のテーブル有効期限を指定した場合は除く)。

デフォルトのテーブル有効期限の表し方は、どの方法で値を設定するかによって異なります。適切な粒度の方法を使用してください。

  • Cloud Console または従来の BigQuery ウェブ UI では、有効期限は日数で表されます。
  • コマンドライン ツールでは、有効期限は秒数で表されます。
  • API では、有効期限はミリ秒数で表されます。

データセットのデフォルトの有効期限を更新するには:

Console

  1. [リソース] ペインで、データセットを選択します。

  2. [詳細] ページで、[データセット情報] の横にある鉛筆アイコンをクリックして有効期限を編集します。

  3. [データセット情報] ダイアログの [デフォルトのテーブルの有効期限] セクションで、[テーブル作成後の日数] の値を入力します。

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

従来の UI

  1. ナビゲーション ペインでデータセットを選択します。

  2. [Dataset Details] ページの [Details] セクションで、[Default Table Expiration] の右側にある [Edit] をクリックします。

    テーブルの有効期限

  3. [Update Expiration] ダイアログで、[Data expiration] の [In] をクリックして新しい有効期限を日数で入力します。デフォルト値は [Never] です。

CLI

データセット内に新しく作成されるテーブルのデフォルト有効期限を更新するには、bq update コマンドで --default_table_expiration フラグを指定します。更新するデータセットがデフォルト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq update \
    --default_table_expiration integer \
    project_id:dataset
    

ここで

  • integer は、新しく作成されるテーブルのデフォルトの存続期間(秒数)です。最小値は 3,600 秒(1 時間)です。現在の UTC 時間にこの整数値を足した値が、有効期限になります。0 を指定すると、既存の有効期限が削除されます。データセット内に作成されたテーブルは、作成時点から integer 秒後に削除されます。この値が適用されるのは、テーブルの作成時にテーブルの有効期限を設定しなかった場合です。
  • project_id はプロジェクト ID です。
  • dataset は、更新するデータセットの名前です。

例:

mydataset 内に新規作成されるテーブルのデフォルトの有効期限を現在時刻から 2 時間(7,200 秒)後に設定するには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトにあります。

bq update --default_table_expiration 7200 mydataset
    

mydataset 内に新規作成されるテーブルのデフォルトの有効期限を現在時刻から 2 時間(7,200 秒)後に設定するには、次のコマンドを入力します。このデータセットはデフォルト プロジェクトではなく myotherproject にあります。

bq update --default_table_expiration 7200 myotherproject:mydataset
    

API

datasets.patch を呼び出して、データセット リソースdefaultTableExpirationMs プロパティを更新します。API では、有効期限はミリ秒数で表されます。datasets.update メソッドはデータセット リソース全体を置き換えるため、datasets.patch メソッドの方が適切です。

Go

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

import (
    	"context"
    	"fmt"
    	"time"

    	"cloud.google.com/go/bigquery"
    )

    // updateDatasetDefaultExpiration demonstrats setting the default expiration of a dataset
    // to a specific retention period.
    func updateDatasetDefaultExpiration(projectID, datasetID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()

    	ds := client.Dataset(datasetID)
    	meta, err := ds.Metadata(ctx)
    	if err != nil {
    		return err
    	}
    	update := bigquery.DatasetMetadataToUpdate{
    		DefaultTableExpiration: 24 * time.Hour,
    	}
    	if _, err := client.Dataset(datasetID).Update(ctx, update, meta.ETag); err != nil {
    		return err
    	}
    	return nil
    }
    

Java

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

Dataset.toBuilder() メソッドを使用して、既存の Dataset インスタンスから Dataset.Builder インスタンスを作成します。データセット ビルダー オブジェクトを構成します。Dataset.Builder.build() メソッドを使用して、更新したデータセットを作成します。Dataset.update() メソッドを呼び出して API に更新を送信します。

Dataset.Builder.setDefaultTableLifetime() メソッドを使用して、デフォルトの有効期限を構成します。

import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Dataset;
    import java.util.concurrent.TimeUnit;

    public class UpdateDatasetExpiration {

      public static void runUpdateDatasetExpiration() {
        // TODO(developer): Replace these variables before running the sample.
        String datasetName = "MY_DATASET_NAME";
        updateDatasetExpiration(datasetName);
      }

      public static void updateDatasetExpiration(String datasetName) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

          // Update dataset expiration to one day
          Long newExpiration = TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);

          Dataset dataset = bigquery.getDataset(datasetName);
          bigquery.update(dataset.toBuilder().setDefaultTableLifetime(newExpiration).build());
          System.out.println("Dataset description updated successfully to " + newExpiration);
        } catch (BigQueryException e) {
          System.out.println("Dataset expiration was not updated \n" + e.toString());
        }
      }
    }

Node.js

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

// Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();

    async function updateDatasetExpiration() {
      // Updates the lifetime of all tables in the dataset, in milliseconds.

      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const datasetId = "my_dataset";

      // Retreive current dataset metadata
      const dataset = bigquery.dataset(datasetId);
      const [metadata] = await dataset.getMetadata();

      // Set new dataset metadata
      const expirationTime = 24 * 60 * 60 * 1000;
      metadata.defaultTableExpirationMs = expirationTime.toString();

      const [apiResponse] = await dataset.setMetadata(metadata);
      const newExpirationTime = apiResponse.defaultTableExpirationMs;

      console.log(`${datasetId} expiration: ${newExpirationTime}`);
    }

Python

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

Dataset.default_table_expiration_ms プロパティを構成し、Client.update_dataset() を呼び出して API に更新を送信します。

    from google.cloud import bigquery

    # Construct a BigQuery client object.
    client = bigquery.Client()

    # TODO(developer): Set dataset_id to the ID of the dataset to fetch.
    # dataset_id = 'your-project.your_dataset'

    dataset = client.get_dataset(dataset_id)  # Make an API request.
    dataset.default_table_expiration_ms = 24 * 60 * 60 * 1000  # In milliseconds.

    dataset = client.update_dataset(
        dataset, ["default_table_expiration_ms"]
    )  # Make an API request.

    full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
    print(
        "Updated dataset {} with new expiration {}".format(
            full_dataset_id, dataset.default_table_expiration_ms
        )
    )

デフォルトのパーティションの有効期限を更新する

データセットのデフォルトのパーティション有効期限は、次の方法で更新できます。

  • bq update CLI コマンドを使用する
  • datasets.patch API メソッドを呼び出す
  • クライアント ライブラリを使用する

現在、Cloud Console および従来の BigQuery ウェブ UI では、データセットのデフォルトのパーティション有効期限の設定または更新はサポートされていません。

デフォルトのパーティション有効期限をデータセット レベルで設定すると、この設定を新規に作成されるすべてのパーティション テーブルに適用できます。パーティション分割テーブルを作成するときに、個々のテーブルにパーティションの有効期限を設定することもできます。デフォルトのパーティション有効期限をデータセット レベルで設定し、デフォルトのテーブル有効期限をデータセット レベルで設定した場合、新しいパーティション分割テーブルにはパーティションの有効期限のみが設定されます。両方のオプションを設定した場合、デフォルトのパーティション有効期限がデフォルトのテーブル有効期限よりも優先されます。

パーティション分割テーブルの作成時にパーティションの有効期限を設定した場合、データセット レベルのデフォルトのパーティション有効期限が無効になり、新たに設定した値が優先されます。

データセット レベルでデフォルトのパーティション有効期限を設定せず、テーブルの作成時にパーティションの有効期限を設定しない場合は、パーティションが期限切れになることはないため、パーティションを手動で削除する必要があります。

データセットにデフォルトのパーティション有効期限を設定すると、その有効期限はデータセット内に作成されたすべてのパーティション分割テーブルのパーティションに適用されます。テーブルにパーティションの有効期限を設定した場合、その有効期限は指定のテーブルに作成されたすべてのパーティションに適用されます。現在、同じテーブル内のパーティションに異なる有効期限を適用することはできません。

データセットのデフォルトのパーティション有効期限を更新する場合、次のことに注意してください。

  • 値を「never」から有限の有効期限に変更する場合、そのデータセット内にすでに存在するテーブルが期限切れになることはありません(そのテーブルの作成時に有効期限が設定されている場合は除く)。
  • デフォルトのパーティション有効期限の値を変更した場合、既存のパーティション分割テーブルのパーティションには元のデフォルトのパーティション有効期限が適用されます。データセット内に新たに作成されたパーティション分割テーブルには、作成時に別のパーティション有効期限を指定しない限り、新しいデフォルトのパーティション有効期限が適用されます。

デフォルトのパーティション有効期限の値は、値の設定場所によって異なります。適切な粒度の方法を使用してください。

  • コマンドライン ツールでは、有効期限は秒数で表されます。
  • API では、有効期限はミリ秒数で表されます。

データセットのデフォルトのパーティション有効期限を更新するには:

Console

現在、Cloud Console では、データセットのデフォルトのパーティション有効期限を更新できません。

従来の UI

現在、従来の BigQuery ウェブ UI では、データセットのデフォルトのパーティション有効期限を更新できません。

CLI

データセットのデフォルトの有効期限を更新するには、--default_partition_expiration フラグを指定して bq update コマンドを入力します。更新するデータセットがデフォルト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq update \
    --default_partition_expiration integer \
    project_id:dataset
    

ここで

  • integer は、新しく作成されるパーティション分割テーブルのパーティションのデフォルトの存続期間(秒数)です。このフラグには最小値はありません。0 を指定すると、既存の有効期限が削除されます。新しく作成されたパーティション分割テーブルのパーティションは、パーティションの作成日(UTC)から [INTEGER] 秒後に削除されます。この値は、作成時にテーブルのパーティションに有効期限を設定していない場合に適用されます。
  • project_id はプロジェクト ID です。
  • dataset は、更新するデータセットの名前です。

例:

次のコマンドを入力して、mydataset に作成された新しいパーティション分割テーブルのデフォルトのパーティション有効期限を 26 時間(93,600 秒)に設定します。このデータセットはデフォルト プロジェクトにあります。

bq update --default_partition_expiration 93600 mydataset
    

次のコマンドを入力して、mydataset に作成された新しいパーティション分割テーブルのデフォルトのパーティション有効期限を 26 時間(93,600 秒)に設定します。このデータセットはデフォルト プロジェクトではなく myotherproject にあります。

bq update --default_partition_expiration 93600 myotherproject:mydataset
    

API

datasets.patch を呼び出して、データセット リソースdefaultPartitionExpirationMs プロパティを更新します。有効期限はミリ秒数で表されます。datasets.update メソッドはデータセット リソース全体を置き換えるため、datasets.patch メソッドの方が適切です。

データセットのアクセス制御の更新

データセットのアクセス制御を更新するプロセスは、アクセス制御をデータセットに割り当てるプロセスと非常によく似ています。Cloud Console、従来の BigQuery ウェブ UI、コマンドライン ツールを使用してデータセットを作成している間は、アクセス制御を適用できません。まずデータセットを作成してから、データセットのアクセス制御を更新する必要があります。API では、datasets.patch メソッドを呼び出してデータセットのアクセス制御を更新できます。

データセットのアクセス制御を更新するときは、以下エンティティを変更できます。

  • Google アカウントのメールアドレス: 個々の Google アカウントにデータセットへのアクセスを許可します。
  • Google グループ: Google グループ内のすべてのメンバーにデータセットへのアクセスを許可します。
  • Google Apps ドメイン: Google ドメイン内のすべてのユーザーとグループにデータセットへのアクセスが許可されます。
  • サービス アカウント: サービス アカウントにデータセットへのアクセスが許可されます。
  • 全員: 一般ユーザーに公開されているデータへのアクセスを許可するには、「allUsers」と入力します。
  • すべての Google アカウント: Google アカウントにログインしたすべてのユーザーにアクセス権を付与するには、「allAuthenticatedUsers」と入力します。
  • 承認済みのビュー: データセットに対する承認済みのビューを許可します。

データセットのアクセス制御を更新するには:

Console

  1. ナビゲーション パネルの [リソース] セクションで、データセットをクリックします。

  2. [共有データセット] をクリックします。

  3. [共有データセット] ダイアログで既存のエントリを削除するには、エントリを展開して削除アイコン(ゴミ箱)をクリックします。

  4. [共有データセット] ダイアログで、新しいエントリを追加します。

    1. [メンバーを追加] ボックスにエンティティを入力します。

    2. [役割を選択] で、リストから適切な Cloud IAM 役割を選択します。事前定義された各 BigQuery 役割に割り当てられている権限の詳細については、事前定義された役割と権限をご覧ください。

    3. [追加] をクリックします。

  5. 承認済みのビューを追加するには、[承認済みのビュー] タブをクリックして、プロジェクト、データセット、ビューを入力し、[追加] をクリックします。

  6. アクセス制御の追加または削除が完了したら、[完了] をクリックします。

従来の UI

  1. データセットの右側にあるプルダウン矢印をクリックし、[Share Dataset] を選択します。

  2. [Share Dataset] ダイアログで、既存のエントリに変更を加えます。

    • エンティティの右側にある X アイコンをクリックして、既存のエントリを削除します。
    • エンティティの権限を変更するには、権限ボタンをクリックして Is ownerOWNER)、Can editWRITER)または Can viewREADER)の中から適切なアクセスレベルを選択します。データセット レベルの役割の詳細については、基本の役割と権限をご覧ください。
  3. [Share Dataset] ダイアログで、新しいエントリを追加します。

    1. [Add People] フィールドの左にあるプルダウンをクリックして適切なオプションを選択します。

    2. テキスト ボックスに値を入力します。たとえば、[User by e-mail] を選択した場合は、ユーザーのメールアドレスを入力します。

    3. [Add People] フィールドの右側にある [Can view] をクリックし、リストから該当する役割を選択します。

      データセットに個人を追加

      • [Can view](READER)を選択すると、データセットに対する bigquery.dataViewer アクセス権が付与されます。
      • [Can edit](WRITER)を選択すると、データセットに対する bigquery.dataEditor アクセス権が付与されます。
      • [Is owner](OWNER)を選択すると、データセットに対する bigquery.dataOwner アクセス権が付与されます。
    4. [Add] をクリックします。

  4. アクセス制御の追加、削除、変更が完了したら、[Save changes] をクリックします。

  5. 設定したアクセス制御を確認するには、データセットの右にあるプルダウン矢印をクリックして [Share Dataset] を選択します。[Share Dataset] ダイアログで設定を確認します。

CLI

  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" セクションに変更を加えます。specialGroup のエントリ(projectOwnersprojectWritersprojectReadersallAuthenticatedUsers)を追加または削除できます。さらに、userByEmailgroupByEmaildomain を追加、削除、変更することもできます。

    たとえば、データセットの 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]"
          }
         ],
        }
        

  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 のリファレンス ドキュメントをご覧ください。

import (
    	"context"
    	"fmt"

    	"cloud.google.com/go/bigquery"
    )

    // updateDatasetAccessControl demonstrates how the access control policy of a dataset
    // can be amended by adding an additional entry corresponding to a specific user identity.
    func updateDatasetAccessControl(projectID, datasetID string) error {
    	// projectID := "my-project-id"
    	// datasetID := "mydataset"
    	ctx := context.Background()
    	client, err := bigquery.NewClient(ctx, projectID)
    	if err != nil {
    		return fmt.Errorf("bigquery.NewClient: %v", err)
    	}
    	defer client.Close()

    	ds := client.Dataset(datasetID)
    	meta, err := ds.Metadata(ctx)
    	if err != nil {
    		return err
    	}
    	// Append a new access control entry to the existing access list.
    	update := bigquery.DatasetMetadataToUpdate{
    		Access: append(meta.Access, &bigquery.AccessEntry{
    			Role:       bigquery.ReaderRole,
    			EntityType: bigquery.UserEmailEntity,
    			Entity:     "sample.bigquery.dev@gmail.com"},
    		),
    	}

    	// Leverage the ETag for the update to assert there's been no modifications to the
    	// dataset since the metadata was originally read.
    	if _, err := ds.Update(ctx, update, meta.ETag); err != nil {
    		return err
    	}
    	return nil
    }
    

Java

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

Dataset.toBuilder() メソッドを使用して、既存の Dataset インスタンスから Dataset.Builder インスタンスを作成します。データセット ビルダー オブジェクトを構成します。Dataset.Builder.build() メソッドを使用して、更新したデータセットを作成します。Dataset.update() メソッドを呼び出して API に更新を送信します。

Dataset.Builder.setAcl() メソッドを使用して、アクセス制御を構成します。

import com.google.cloud.bigquery.Acl;
    import com.google.cloud.bigquery.Acl.Role;
    import com.google.cloud.bigquery.Acl.User;
    import com.google.cloud.bigquery.BigQuery;
    import com.google.cloud.bigquery.BigQueryException;
    import com.google.cloud.bigquery.BigQueryOptions;
    import com.google.cloud.bigquery.Dataset;
    import java.util.ArrayList;

    public class UpdateDatasetAccess {

      public static void runUpdateDatasetAccess() {
        // TODO(developer): Replace these variables before running the sample.
        String datasetName = "MY_DATASET_NAME";
        updateDatasetAccess(datasetName);
      }

      public static void updateDatasetAccess(String datasetName) {
        try {
          // Initialize client that will be used to send requests. This client only needs to be created
          // once, and can be reused for multiple requests.
          BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

          Dataset dataset = bigquery.getDataset(datasetName);

          // Create a new ACL granting the READER role to "sample.bigquery.dev@gmail.com"
          // For more information on the types of ACLs available see:
          // https://cloud.google.com/storage/docs/access-control/lists
          Acl newEntry = Acl.of(new User("sample.bigquery.dev@gmail.com"), Role.READER);

          // Get a copy of the ACLs list from the dataset and append the new entry
          ArrayList<Acl> acls = new ArrayList<>(dataset.getAcl());
          acls.add(newEntry);

          bigquery.update(dataset.toBuilder().setAcl(acls).build());
          System.out.println("Dataset Access Control updated successfully");
        } catch (BigQueryException e) {
          System.out.println("Dataset Access control was not updated \n" + e.toString());
        }
      }
    }

Node.js

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

// Import the Google Cloud client library
    const {BigQuery} = require('@google-cloud/bigquery');
    const bigquery = new BigQuery();

    async function updateDatasetAccess() {
      // Updates a datasets's access controls.

      /**
       * TODO(developer): Uncomment the following lines before running the sample.
       */
      // const datasetId = "my_dataset";

      // Create new role metadata
      const newRole = {
        role: 'READER',
        entity_type: 'userByEmail',
        userByEmail: 'sample.bigquery.dev@gmail.com',
      };

      // Retreive current dataset metadata
      const dataset = bigquery.dataset(datasetId);
      const [metadata] = await dataset.getMetadata();

      // Add new role to role acess array
      metadata.access.push(newRole);
      const [apiResponse] = await dataset.setMetadata(metadata);
      const newAccessRoles = apiResponse.access;
      newAccessRoles.forEach(role => console.log(role));
    }

Python

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

dataset.access_entries プロパティを使用してデータセットのアクセス制御を設定します。次に、client.update_dataset() 関数を呼び出してプロパティを更新します。
from google.cloud import bigquery

    # Construct a BigQuery client object.
    client = bigquery.Client()

    # TODO(developer): Set dataset_id to the ID of the dataset to fetch.
    # dataset_id = 'your-project.your_dataset'

    dataset = client.get_dataset(dataset_id)  # Make an API request.

    entry = bigquery.AccessEntry(
        role="READER",
        entity_type="userByEmail",
        entity_id="sample.bigquery.dev@gmail.com",
    )

    entries = list(dataset.access_entries)
    entries.append(entry)
    dataset.access_entries = entries

    dataset = client.update_dataset(dataset, ["access_entries"])  # Make an API request.

    full_dataset_id = "{}.{}".format(dataset.project, dataset.dataset_id)
    print(
        "Updated dataset '{}' with modified user permissions.".format(full_dataset_id)
    )

次のステップ