已授权的例程
借助授权例程,您可以与特定用户或群组共享查询结果,而无需为其授予生成结果的底层表的访问权限。例如,已获授权的例程可以计算对数据的聚合,也可以查找表值并在计算中使用该值。
默认情况下,如果用户调用例程,则用户必须具有读取表中的数据的权限。或者,您也可以授权该例程访问包含被引用表的数据集。授权例程可以查询数据集中的表,即使调用该例程的用户无法直接查询这些表也是如此。
可以对以下类型的例程进行授权:
向例程授权
如需向例程授权,请使用 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');