獲得授權的處理常式
授權常式可讓您與特定使用者或群組分享查詢結果,無須授予他們基礎資料表的存取權。舉例來說,授權常式可以計算資料匯總,或查詢資料表值,並在計算中使用該值。
根據預設,如果使用者叫用常式,則必須具備資料表資料的讀取權限。或者,您也可以授權常式存取含有參照資料表的資料集。授權常式可以查詢資料集中的資料表,即使呼叫常式的使用者無法直接查詢這些資料表也沒問題。
可授權的日常安排類型如下:
授權給處理常式
如要授權常式,請使用 Google Cloud 控制台、bq 指令列工具或 REST API:
控制台
前往 Google Cloud 控制台的「BigQuery」頁面。
點選左側窗格中的 「Explorer」。

如果沒有看到左側窗格,請按一下 「Expand left pane」(展開左側窗格),開啟窗格。
在「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:日常安排的名稱。
選用:如要授權預存程序,請附加 IAM 角色。這個角色會根據權限,限制對已授權程序的存取。方法是在 JSON 物件中加入
"role":{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
將
ROLE_NAME替換為要附加的角色名稱。您可以將下列角色附加至預存程序:- BigQuery 常式中繼資料檢視者 (
roles/bigquery.routineMetadataViewer) - BigQuery 常式資料檢視者 (
roles/bigquery.routineDataViewer) - BigQuery 常式資料編輯者 (
roles/bigquery.routineDataEditor) - BigQuery 常式管理員 (
roles/bigquery.routineAdmin)
- BigQuery 常式中繼資料檢視者 (
使用
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:日常安排的名稱。
選用:如要授權預存程序,請附加 IAM 角色。這個角色會根據權限,限制對授權程序的存取。如要這麼做,請在 JSON 物件中加入
"role":{ "role": "ROLE_NAME", "routine": { "datasetId": "DATASET_NAME", "projectId": "PROJECT_ID", "routineId": "ROUTINE_NAME" } }
將
ROLE_NAME替換為要附加的角色名稱。您可以將下列角色附加至預存程序:- BigQuery 常式中繼資料檢視者 (
roles/bigquery.routineMetadataViewer) - BigQuery 常式資料檢視者 (
roles/bigquery.routineDataViewer) - BigQuery 常式資料編輯者 (
roles/bigquery.routineDataEditor) - BigQuery 常式管理員 (
roles/bigquery.routineAdmin)
- BigQuery 常式中繼資料檢視者 (
使用修改後的
Dataset表示法呼叫dataset.update方法。
配額與限制
已授權的常式受資料集限制。詳情請參閱「資料集限制」。
如果您更新常式,現有的授權常式授權就會到期。BigQuery 會在 24 小時內自動移除過時的授權常式授權項目。如要立即更新項目,必須先從「目前授權的日常安排」清單中手動刪除項目,再重新授權。
限制
您無法在次要副本中建立授權常式。詳情請參閱「資料集複製中的資源行為」。
授權常式範例
以下是建立及使用授權 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));將
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');