承認済みルーティン

承認済みのルーティンを使用すると、結果を生成した基盤となるテーブルへのアクセス権を特定のユーザーまたはグループに付与せずに、そのユーザーまたはグループとクエリ結果を共有できます。たとえば、承認済みのルーティンを使用してデータ集計を実行したり、テーブル値を検索してその値を計算で使用できます。

デフォルトでは、ユーザーがルーティンを呼び出すと、テーブル内のデータを読み取る権限を持っている必要があります。または、参照されるテーブルを含むデータセットにアクセスするルーティンを承認できます。承認されたルーティンでは、ルーティンを呼び出すユーザーがテーブルを直接クエリできない場合でも、データセット内のテーブルをクエリできます。

承認できるルーティンの種類は次のとおりです。

ルーティンを承認する

ルーティンを承認するには、Google Cloud コンソール、bq コマンドライン ツール、または REST API を使用します。

コンソール

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

    [BigQuery] に移動

  2. ナビゲーション パネルの [エクスプローラ] セクションでプロジェクトを展開し、データセットを選択します。

  3. 詳細パネルで [共有] を展開し、[ルーティンを承認] をクリックします。

  4. [承認済みルーティン] ページの [ルーティンを承認] セクションで、承認するルーティンの [プロジェクト]、[データセット]、[ルーティン] を選択します。

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

bq

  1. bq show コマンドを使用して、ルーティンでアクセスするデータセットの JSON 表現を取得します。コマンドからの出力は、Dataset リソースの JSON 表現です。結果をローカル ファイルに保存します。

    bq show --format=prettyjson TARGET_DATASET > dataset.json
    

    TARGET_DATASET は、ルーティンでアクセスできるデータセットの名前に置き換えます。

  2. ファイルを編集して、Dataset リソースの access 配列に次の JSON オブジェクトを追加します。

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }
    

    各要素の意味は次のとおりです。

    • DATASET_NAME は、ルーティンを含むデータセットの名前です。
    • PROJECT_ID は、ルーティンを含むプロジェクトのプロジェクト ID です。
    • ROUTINE_NAME はルーティンの名前です。
  3. bq update コマンドを使用してデータセットを更新します。

    bq update --source dataset.json TARGET_DATASET
    

API

  1. datasets.get メソッドを呼び出して、ルーティンでアクセスするデータセットを取得します。レスポンスの本文には Dataset リソースの表現が含まれます。

  2. 次の JSON オブジェクトを Dataset リソースの access 配列に追加します。

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }
    

    各要素の意味は次のとおりです。

    • DATASET_NAME は、UDF を含むデータセットの名前です。
    • PROJECT_ID は、UDF を含むプロジェクトのプロジェクト ID です。
    • ROUTINE_NAME はルーティンの名前です。
  3. 変更した Dataset 表現を使用して、dataset.update メソッドを呼び出します。

割り当てと上限

承認済みルーティンには、データセットの上限が適用されます。詳細については、データセットの上限をご覧ください。

承認されたルーティンの例

以下は、認可済みの UDF を作成して使用するエンドツーエンドの例です。

  1. private_datasetpublic_dataset という名前の 2 つのデータセットを作成します。データセットの作成の詳細については、データセットの作成をご覧ください。

  2. 次のステートメントを実行して、private_datasetprivate_table という名前のテーブルを作成します。

    CREATE OR REPLACE TABLE private_dataset.private_table
    AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
    
  3. 次のステートメントを実行して、public_datasetcount_key という名前の UDF を作成します。UDF には private_tableSELECT ステートメントが含まれます。

    CREATE OR REPLACE FUNCTION public_dataset.count_key(input_key STRING)
    RETURNS INT64
    AS
    ((SELECT COUNT(1) FROM private_dataset.private_table t WHERE t.key = input_key));
    
  4. public_dataset データセットの bigquery.dataViewer ロールをユーザーに付与します。このロールには、ユーザーがルーティンを呼び出すための bigquery.routines.get 権限が含まれています。データセットにアクセス制御を割り当てる方法については、データセットへのアクセスの制御をご覧ください。

  5. この時点で、ユーザーは count_key ルーティンを呼び出す権限を持っていますが、private_dataset のテーブルにアクセスできません。ユーザーがルーティンを呼び出そうとすると、次のようなエラー メッセージが表示されます。

    Access Denied: Table myproject:private_dataset.private_table: User does
    not have permission to query table myproject:private_dataset.private_table.
    
  6. bq コマンドライン ツールを使用して、次のように show コマンドを実行します。

    bq show --format=prettyjson private_dataset > dataset.json
    

    出力は dataset.json という名前のローカル ファイルに保存されます。

  7. dataset.json を編集して、次の JSON オブジェクトを access 配列に追加します。

    {
     "routine": {
       "datasetId": "public_dataset",
       "projectId": "PROJECT_ID",
       "routineId": "count_key"
     }
    }
    

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

  8. bq コマンドライン ツールを使用して、次のように update コマンドを実行します。

    bq update --source dataset.json private_dataset
    
  9. UDF が private_dataset にアクセスできることを確認するには、次のクエリを実行します。

    SELECT public_dataset.count_key('key1');