承認済み関数
承認済みの関数を使用すると、特定のユーザーまたはグループに基になるテーブルへのアクセス権を付与せずに、そのユーザーまたはグループとクエリ結果を共有できます。たとえば、認可済みの関数を使用すると、データの集計を行うことができます。また、テーブル値の検索を行い、その値を計算で使用することもできます。
デフォルトでは、ユーザー定義関数(UDF)またはテーブル関数がテーブルにクエリを実行する場合、その関数を呼び出すユーザーはテーブル内のデータを読み取る権限を持っている必要があります。または、参照されるテーブルを含むデータセットにアクセスする関数を承認できます。承認された関数では、関数を呼び出すユーザーがテーブルを直接クエリできない場合でも、データセット内のテーブルをクエリできます。
関数を承認する
UDF とテーブル関数の両方を承認できます。関数を認可するには、Google Cloud Console、REST API、または bq
コマンドライン ツールを使用します。
コンソール
Google Cloud Console の [BigQuery] ページに移動します。
ナビゲーション パネルの [リソース] セクションでプロジェクトを展開し、データセットを選択します。
詳細パネルで、[ルーティンを承認] をクリックします。
[承認済みルーティン] ページの [ルーティンを承認] セクションで、承認する関数のプロジェクト ID、データセット ID、ルーティン ID を選択します。
[承認を追加] をクリックします。
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
メソッドを呼び出します。
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
認可済み関数の例
以下は、認可済みの 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');