獲得授權的處理常式
授權常式可讓您與特定使用者或群組分享查詢結果,而不必授予他們產生結果的基礎資料表存取權。舉例來說,授權常式可以計算資料的匯總值,或查閱資料表值並用於計算。
在預設情況下,使用者必須有權讀取資料表中的資料,才能叫用常式。或者,您也可以授權處理常式存取包含參照資料表的資料集。即使呼叫處理常式的使用者無法直接查詢資料表,獲授權的處理常式仍可查詢資料集中的資料表。
你可以授權下列類型的日常安排:
授權處理常式
如要授權常式,請使用 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');