承認済みルーティン
承認済みのルーティンを使用すると、結果を生成した基盤となるテーブルへのアクセス権を特定のユーザーまたはグループに付与せずに、そのユーザーまたはグループとクエリ結果を共有できます。たとえば、承認済みのルーティンを使用してデータ集計を実行したり、テーブル値を検索してその値を計算で使用できます。
デフォルトでは、ユーザーがルーティンを呼び出すと、テーブル内のデータを読み取る権限を持っている必要があります。または、参照されるテーブルを含むデータセットにアクセスするルーティンを承認できます。承認されたルーティンでは、ルーティンを呼び出すユーザーがテーブルを直接クエリできない場合でも、データセット内のテーブルをクエリできます。
承認できるルーティンの種類は次のとおりです。
ルーティンを承認する
ルーティンを承認するには、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');