獲得授權的處理常式
授權常式可讓您與特定使用者或群組分享查詢結果,而不必授予他們產生結果的基礎資料表存取權。舉例來說,授權常式可以計算資料的匯總值,或查閱資料表值並用於計算。
在預設情況下,使用者必須有權讀取資料表中的資料,才能叫用常式。或者,您也可以授權處理常式存取包含參照資料表的資料集。即使呼叫處理常式的使用者無法直接查詢資料表,獲授權的處理常式仍可查詢資料集中的資料表。
你可以授權下列類型的日常安排:
授權處理常式
如要授權常式,請使用 Google Cloud 主控台、bq 指令列工具或 REST API:
主控台
- 前往 Google Cloud 控制台的「BigQuery」頁面。 
- 在左側窗格中,按一下「Explorer」:  - 如果沒有看到左側窗格,請按一下「展開左側窗格」圖示 開啟窗格。 
- 在「Explorer」窗格中展開專案,按一下「Datasets」(資料集),然後選取資料集。 
- 在詳細資料窗格中,依序點選「共用」>「授權常式」。 
- 在「Authorized routines」(已授權的處理常式) 頁面的「Authorize routine」(授權處理常式) 部分,選取要授權的處理常式所屬的「Project」(專案)、「Dataset」(資料集) 和「Routine」(處理常式)。 
- 按一下「新增授權」。 
bq
- 使用 - bq show指令,取得您要讓常式存取的資料集 JSON 表示法。指令輸出內容是- Dataset資源的 JSON 表示法。將結果儲存至本機檔案。- bq show --format=prettyjson TARGET_DATASET > dataset.json - 將 TARGET_DATASET 替換為處理常式可存取的資料集名稱。 
- 編輯檔案,將下列 JSON 物件新增至 - Dataset資源中的- access陣列:- { "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資源的表示法。
- 在 - Dataset資源的- access陣列中新增下列 JSON 物件:- { "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的兩個資料集。如要進一步瞭解如何建立資料集,請參閱建立資料集。
- 執行下列陳述式,在 - 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));
- 將 - bigquery.dataViewer角色授予資料集的使用者。- public_dataset這個角色包含- 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');