已授权的例程
借助授权例程,您可以与特定用户或群组共享查询结果,而无需为其授予生成结果的底层表的访问权限。例如,已获授权的例程可以计算对数据的聚合,也可以查找表值并在计算中使用该值。
默认情况下,如果用户调用例程,则用户必须具有读取表中的数据的权限。或者,您也可以授权该例程访问包含被引用表的数据集。授权例程可以查询数据集中的表,即使调用该例程的用户无法直接查询这些表也是如此。
可以授权以下类型的日常安排:
向例程授权
如需向例程授权,请使用 Google Cloud 控制台、bq 命令行工具或 REST API:
控制台
- 前往 Google Cloud 控制台中的 BigQuery 页面。 
- 在左侧窗格中,点击 探索器:  - 如果您没有看到左侧窗格,请点击 展开左侧窗格以打开该窗格。 
- 在探索器窗格中,展开您的项目,点击数据集,然后选择一个数据集。 
- 在详细信息窗格中,点击共享 > 为例程授权。 
- 在为例程授权页面的为例程授权部分中,选择要为其授权的例程的项目、数据集和例程。 
- 点击添加授权。 
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');