已授权的例程

借助授权例程,您可以与特定用户或群组共享查询结果,而无需为其授予生成结果的底层表的访问权限。例如,已获授权的例程可以计算对数据的聚合,也可以查找表值并在计算中使用该值。

默认情况下,如果用户调用例程,则用户必须具有读取表中的数据的权限。或者,您也可以授权该例程访问包含被引用表的数据集。授权例程可以查询数据集中的表,即使调用该例程的用户无法直接查询这些表也是如此。

可以授权以下类型的日常安排:

向例程授权

如需向例程授权,请使用 Google Cloud 控制台、bq 命令行工具或 REST API:

控制台

  1. 前往 Google Cloud 控制台中的 BigQuery 页面。

    转到 BigQuery

  2. 在导航面板的探索器部分中,展开您的项目并选择数据集。

  3. 在详细信息面板中,展开共享,然后点击为例程授权

  4. 为例程授权页面的为例程授权部分中,选择要为其授权的例程的项目数据集例程

  5. 点击添加授权

bq

  1. 使用 bq show 命令获取您希望例程访问的数据集的 JSON 表示法。该命令的输出是 Dataset 资源的 JSON 表示法。将结果保存到本地文件。

    bq show --format=prettyjson TARGET_DATASET > dataset.json

    TARGET_DATASET 替换为该例程可访问的数据集的名称。

  2. 修改该文件,将以下 JSON 对象添加到 Dataset 资源中的 access 数组:

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }

    其中:

    • DATASET_NAME 是包含例程的数据集的名称。
    • PROJECT_ID 是包含例程的项目的 ID。
    • ROUTINE_NAME 是例程的名称。
  3. 使用 bq update 命令更新数据集。

    bq update --source dataset.json TARGET_DATASET

API

  1. 调用 datasets.get 方法,提取您希望例程访问的数据集。响应正文包含 Dataset 资源的表示法。

  2. 将以下 JSON 对象添加到 Dataset 资源中的 access 数组:

    {
     "routine": {
       "datasetId": "DATASET_NAME",
       "projectId": "PROJECT_ID",
       "routineId": "ROUTINE_NAME"
     }
    }

    其中:

    • DATASET_NAME 是包含 UDF 的数据集的名称。
    • PROJECT_ID 是包含 UDF 的项目的 ID。
    • ROUTINE_NAME 是例程的名称。
  3. 使用修改后的 Dataset 表示法调用 dataset.update 方法。

配额和限制

获授权例程受到数据集限制的约束。如需了解详情,请参阅数据集限制

授权例程示例

以下是创建和使用已获授权的 UDF 的端到端示例。

  1. 创建名为 private_datasetpublic_dataset 的两个数据集。如需详细了解如何创建数据集,请参阅创建数据集

  2. 运行以下语句以在 private_dataset 中创建名为 private_table 的表:

    CREATE OR REPLACE TABLE private_dataset.private_table
    AS SELECT key FROM UNNEST(['key1', 'key1','key2','key3']) key;
    
  3. 运行以下语句以在 public_dataset 中创建名为 count_key 的表:UDF 包含一个针对 private_tableSELECT 语句。

    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));
    
  4. 向用户授予针对 public_dataset 数据集的 bigquery.dataViewer 角色。此角色包含 bigquery.routines.get 权限,此权限可让用户调用例程。如需了解如何分配对数据集的访问权限控制,请参阅控制对数据集的访问权限

  5. 此时,用户有权调用 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.
    
  6. 使用 bq 命令行工具运行 show 命令,如下所示:

    bq show --format=prettyjson private_dataset > dataset.json

    输出将保存到名为 dataset.json 的本地文件中。

  7. 修改 dataset.json 以将下列 JSON 对象添加到 access 数组中:

    {
     "routine": {
       "datasetId": "public_dataset",
       "projectId": "PROJECT_ID",
       "routineId": "count_key"
     }
    }

    PROJECT_ID 替换为 public_dataset 的项目 ID。

  8. 使用 bq 命令行工具运行 update 命令,如下所示:

    bq update --source dataset.json private_dataset
  9. 如需验证 UDF 是否有权访问 private_dataset,用户可以运行以下查询:

    SELECT public_dataset.count_key('key1');