已授权的例程
借助授权例程,您可以与特定用户或群组共享查询结果,而无需为其授予生成结果的底层表的访问权限。例如,已获授权的例程可以计算对数据的聚合,也可以查找表值并在计算中使用该值。
默认情况下,如果用户调用例程,则用户必须具有读取表中的数据的权限。或者,您也可以授权该例程访问包含被引用表的数据集。授权例程可以查询数据集中的表,即使调用该例程的用户无法直接查询这些表也是如此。
可以授权以下类型的日常安排:
向例程授权
如需向例程授权,请使用 Google Cloud 控制台、bq 命令行工具或 REST API:
控制台
前往 Google Cloud 控制台中的 BigQuery 页面。
在左侧窗格中,点击 Explorer:

如果您没有看到左侧窗格,请点击 展开左侧窗格以打开该窗格。
在浏览器窗格中,展开您的项目,点击数据集,然后选择一个数据集。
在详细信息窗格中,点击共享 > 为例程授权。
在为例程授权页面的为例程授权部分中,选择要为其授权的例程的项目、数据集和例程。
点击添加授权。
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资源的表示法。将以下 JSON 对象添加到
Dataset资源中的access数组:{ "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 包含一个针对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');