獲得授權的處理常式

授權常式可讓您與特定使用者或群組分享查詢結果,而不必授予他們產生結果的基礎資料表存取權。舉例來說,授權常式可以計算資料的匯總值,或查閱資料表值並用於計算。

在預設情況下,使用者必須有權讀取資料表中的資料,才能叫用常式。或者,您也可以授權處理常式存取包含參照資料表的資料集。即使呼叫處理常式的使用者無法直接查詢資料表,獲授權的處理常式仍可查詢資料集中的資料表。

你可以授權下列類型的日常安排:

授權處理常式

如要授權常式,請使用 Google Cloud 主控台、bq 指令列工具或 REST API:

主控台

  1. 前往 Google Cloud 控制台的「BigQuery」頁面。

    前往「BigQuery」

  2. 在左側窗格中,按一下「Explorer」

    醒目顯示的「Explorer」窗格按鈕。

    如果沒有看到左側窗格,請按一下「展開左側窗格」圖示 開啟窗格。

  3. 在「Explorer」窗格中展開專案,按一下「Datasets」(資料集),然後選取資料集。

  4. 在詳細資料窗格中,依序點選「共用」>「授權常式」

  5. 在「Authorized routines」(已授權的處理常式) 頁面的「Authorize routine」(授權處理常式) 部分,選取要授權的處理常式所屬的「Project」(專案)、「Dataset」(資料集) 和「Routine」(處理常式)

  6. 按一下「新增授權」

bq

  1. 使用 bq show 指令,取得您要讓常式存取的資料集 JSON 表示法。指令輸出內容是 Dataset 資源的 JSON 表示法。將結果儲存至本機檔案。

    bq show --format=prettyjson TARGET_DATASET > dataset.json

    TARGET_DATASET 替換為處理常式可存取的資料集名稱。

  2. 編輯檔案,將下列 JSON 物件新增至 Dataset 資源中的 access 陣列:

    {
     "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

API

  1. 呼叫 datasets.get 方法,擷取要讓常式存取的資料集。回應內容包含 Dataset 資源的表示法。

  2. Dataset 資源的 access 陣列中新增下列 JSON 物件:

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }

    其中:

    • DATASET_NAME 是含有 UDF 的資料集名稱。
    • PROJECT_ID 是包含 UDF 的專案 ID。
    • ROUTINE_NAME 是常式的名稱。
  3. 使用修改後的 Dataset 表示法呼叫 dataset.update 方法。

配額與限制

獲得授權的處理常式會受到資料集限制。詳情請參閱「資料集限制」一節。

獲得授權的處理常式範例

以下是建立及使用授權 UDF 的端對端範例。

  1. 建立名為 private_datasetpublic_dataset 的兩個資料集。如要進一步瞭解如何建立資料集,請參閱建立資料集

  2. 執行下列陳述式,在 private_dataset 中建立名為 private_table 的資料表:

    CREATE OR REPLACE TABLE private_dataset.private_table
    AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
    
  3. 執行下列陳述式,在 public_dataset 中建立名為 count_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. bigquery.dataViewer 角色授予資料集的使用者。public_dataset這個角色包含 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');