承認済みルーティン
承認済みのルーティンを使用すると、結果を生成した基盤となるテーブルへのアクセス権を特定のユーザーまたはグループに付与せずに、そのユーザーまたはグループとクエリ結果を共有できます。たとえば、承認済みのルーティンを使用してデータ集計を実行したり、テーブル値を検索してその値を計算で使用できます。
デフォルトでは、ユーザーがルーティンを呼び出すと、テーブル内のデータを読み取る権限を持っている必要があります。または、参照されるテーブルを含むデータセットにアクセスするルーティンを承認できます。承認されたルーティンでは、ルーティンを呼び出すユーザーがテーブルを直接クエリできない場合でも、データセット内のテーブルをクエリできます。
承認できるルーティンの種類は次のとおりです。
ルーティンを承認する
ルーティンを承認するには、 Google Cloud コンソール、bq コマンドライン ツール、または REST API を使用します。
コンソール
Google Cloud コンソールの [BigQuery] ページに移動します。
左側のペインで、 [エクスプローラ] をクリックします。

左側のペインが表示されていない場合は、 左側のペインを開くをクリックしてペインを開きます。
[エクスプローラ] ペインでプロジェクトを開き、[データセット] をクリックして、データセットを選択します。
詳細ペインで、[共有] > [ルーティンを承認] をクリックします。
[承認済みルーティン] ページの [ルーティンを承認] セクションで、承認するルーティンの [プロジェクト]、[データセット]、[ルーティン] を選択します。
[承認を追加] をクリックします。
bq
bq showコマンドを使用して、ルーティンでアクセスするデータセットの JSON 表現を取得します。コマンドからの出力は、Datasetリソースの JSON 表現です。結果をローカル ファイルに保存します。bq show --format=prettyjson TARGET_DATASET > dataset.json
TARGET_DATASET は、ルーティンでアクセスできるデータセットの名前に置き換えます。
ファイルを編集して、
Datasetリソースのaccess配列に次の JSON オブジェクトを追加します。{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
ここで
- DATASET_NAME は、ルーティンを含むデータセットの名前です。
- PROJECT_ID は、ルーティンを含むプロジェクトのプロジェクト ID です。
- ROUTINE_NAME はルーティンの名前です。
bq updateコマンドを使用してデータセットを更新します。bq update --source dataset.json TARGET_DATASET
API
datasets.getメソッドを呼び出して、ルーティンでアクセスするデータセットを取得します。レスポンスの本文にはDatasetリソースの表現が含まれます。次の JSON オブジェクトを
Datasetリソースのaccess配列に追加します。{ "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
ここで
- DATASET_NAME は、UDF を含むデータセットの名前です。
- PROJECT_ID は、UDF を含むプロジェクトのプロジェクト ID です。
- ROUTINE_NAME はルーティンの名前です。
変更した
Dataset表現を使用して、dataset.updateメソッドを呼び出します。
割り当てと上限
承認済みルーティンには、データセットの上限が適用されます。詳細については、データセットの上限をご覧ください。
承認されたルーティンの例
以下は、認可済みの UDF を作成して使用するエンドツーエンドの例です。
private_datasetとpublic_datasetという名前の 2 つのデータセットを作成します。データセットの作成の詳細については、データセットの作成をご覧ください。次のステートメントを実行して、
private_datasetにprivate_tableという名前のテーブルを作成します。CREATE OR REPLACE TABLE private_dataset.private_table AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;次のステートメントを実行して、
public_datasetにcount_keyという名前の UDF を作成します。UDF にはprivate_tableのSELECTステートメントが含まれます。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));public_datasetデータセットのbigquery.dataViewerロールをユーザーに付与します。このロールには、ユーザーがルーティンを呼び出すためのbigquery.routines.get権限が含まれています。データセットにアクセス制御を割り当てる方法については、データセットへのアクセスの制御をご覧ください。この時点で、ユーザーは
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.
bq コマンドライン ツールを使用して、次のように
showコマンドを実行します。bq show --format=prettyjson private_dataset > dataset.json
出力は
dataset.jsonという名前のローカル ファイルに保存されます。dataset.jsonを編集して、次の JSON オブジェクトをaccess配列に追加します。{ "routine": { "datasetId": "public_dataset", "projectId": "PROJECT_ID", "routineId": "count_key" } }
PROJECT_ID は、
public_datasetのプロジェクト ID に置き換えます。bq コマンドライン ツールを使用して、次のように
updateコマンドを実行します。bq update --source dataset.json private_dataset
UDF が
private_datasetにアクセスできることを確認するには、次のクエリを実行します。SELECT public_dataset.count_key('key1');