承認済みルーティン
承認済みのルーティンを使用すると、結果を生成した基盤となるテーブルへのアクセス権を特定のユーザーまたはグループに付与せずに、そのユーザーまたはグループとクエリ結果を共有できます。たとえば、承認済みのルーティンを使用してデータ集計を実行したり、テーブル値を検索してその値を計算で使用できます。
デフォルトでは、ユーザーがルーティンを呼び出すと、テーブル内のデータを読み取る権限を持っている必要があります。または、参照されるテーブルを含むデータセットにアクセスするルーティンを承認できます。承認されたルーティンでは、ルーティンを呼び出すユーザーがテーブルを直接クエリできない場合でも、データセット内のテーブルをクエリできます。
承認できるルーティンの種類は次のとおりです。
ルーティンを承認する
ルーティンを承認するには、 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: ルーティンの名前。
省略可: ストアド プロシージャを承認する場合は、IAM ロールを関連付けます。このロールは、権限に基づいて承認済みプロシージャへのアクセスを制限します。これを行うには、JSON オブジェクトに
"role"を追加します。{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
ROLE_NAMEは、関連付けるロールの名前に置き換えます。次のロールをストアド プロシージャに付与できます。- BigQuery ルーティン メタデータ閲覧者(
roles/bigquery.routineMetadataViewer) - BigQuery ルーティン データ閲覧者(
roles/bigquery.routineDataViewer) - BigQuery ルーティン データ編集者(
roles/bigquery.routineDataEditor) - BigQuery ルーティン管理者(
roles/bigquery.routineAdmin)
- BigQuery ルーティン メタデータ閲覧者(
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: ルーティンの名前。
省略可: ストアド プロシージャを承認する場合は、IAM ロールを関連付けます。このロールは、権限に基づいて承認済みプロシージャへのアクセスを制限します。これを行うには、JSON オブジェクトに
"role"を追加します。{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
ROLE_NAMEは、関連付けるロールの名前に置き換えます。次のロールをストアド プロシージャに付与できます。- BigQuery ルーティン メタデータ閲覧者(
roles/bigquery.routineMetadataViewer) - BigQuery ルーティン データ閲覧者(
roles/bigquery.routineDataViewer) - BigQuery ルーティン データ編集者(
roles/bigquery.routineDataEditor) - BigQuery ルーティン管理者(
roles/bigquery.routineAdmin)
- BigQuery ルーティン メタデータ閲覧者(
変更した
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');