承認済み関数

承認済みの関数を使用すると、特定のユーザーまたはグループに基になるテーブルへのアクセス権を付与せずに、そのユーザーまたはグループとクエリ結果を共有できます。たとえば、認可済みの関数を使用すると、データの集計を行うことができます。また、テーブル値の検索を行い、その値を計算で使用することもできます。

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

関数を承認する

UDF とテーブル関数の両方を承認できます。関数を認可するには、Google Cloud Console、REST API、または bq コマンドライン ツールを使用します。

コンソール

  1. Google Cloud Console の [BigQuery] ページに移動します。

    BigQuery に移動

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

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

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

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

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 メソッドを呼び出します。

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
    

認可済み関数の例

以下は、認可済みの 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');