已获授权的数据集

本文档介绍如何在 BigQuery 中使用授权数据集。授权数据集可用于向指定数据集中的所有视图授权访问另一个数据集中的数据。使用授权数据集时,您无需配置单个授权视图

您可以使用以下工具在 BigQuery 中创建授权数据集:

概览

BigQuery 中的视图是由 SQL 查询定义的虚拟表。例如,视图的查询可能仅返回表的一部分列,排除包含个人身份信息 (PII) 的列。要查询视图,用户需要有权访问该视图的查询所访问的资源。

如果要允许用户查询视图,可使用授权视图,而不授予他们直接访问该视图引用的资源的权限。例如,通过授权视图可与指定组或用户(主账号)共享视图中更加有限的数据,而不是授予主账号对所有底层数据的访问权限。为此,您可以向主账号授予对视图的访问权限,并向视图授予对包含底层数据的数据集的访问权限。

如果要向一系列视图授予数据集的访问权限,而无需为每个视图授权,可以将视图分组到一个数据集中,然后向包含这些视图的数据集授予访问包含此数据的数据集的权限。然后,您可以根据需要向主账号授予对包含一组视图的数据集的访问权限,或者为数据集中的个别视图授予访问权限。有权访问另一个数据集的数据集称为“授权数据集”。授权另一个数据集访问其数据的数据集称为“共享数据集”

所需的权限和角色

如需向数据集授权或撤消数据集的授权,您必须具有以下 Identity and Access Management (IAM) 权限,它让您能够更新要共享的数据集的访问控制列表。

在数据集获得授权后,如果要在授权数据集中创建或更新视图,您也需要这些权限。如需了解详情,请参阅在授权数据集中创建或更新视图

权限 资源
bigquery.datasets.get 您要共享的数据集。
bigquery.datasets.update 您要共享的数据集。

以下预定义的 IAM 角色提供了所需的权限。

角色 说明
bigquery.dataOwner BigQuery Data Owner
bigquery.admin BigQuery Admin

配额和限制

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

向数据集授权

您可以将要授权的数据集添加到要共享的数据集的访问权限列表,授权该数据集当前和未来的视图访问另一个数据集,如下所示:

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器面板中,展开您的项目,然后选择包含您要共享的数据的数据集。

  3. 点击 操作图标,然后选择打开

  4. 在显示的“详细信息”窗格中,点击共享并选择向数据集授权选项。

    在 Google Cloud 控制台中授权数据集

  5. 在显示的授权数据集窗格中,按照以下格式输入要授权的数据集的数据集 ID

    PROJECT.AUTHORIZED_DATASET

    例如:

    myProject.myDataset

  6. 点击添加授权,然后点击关闭

bq

  1. 打开 Cloud Shell:

    转到 Cloud Shell

  2. 使用 bq show 命令将您要共享的数据集的现有元数据(包括访问控制列表)写入 JSON 文件中。

    bq show --format=prettyjson PROJECT:SHARED_DATASET > FILE_PATH
  3. 使用文本编辑器将您要授权的数据集添加到在 FILE_PATH 处创建的 JSON 文件的现有 access 部分中。

    例如:

    "access": [
     ...
     {
       "dataset": {
         "dataset": {
           "project_id": "PROJECT",
           "dataset_id": "AUTHORIZED_DATASET"
         },
         "target_types": "VIEWS"
       }
     }
    ]

  4. 使用 bq update 命令更新共享数据集。例如:

    bq update --source FILE_PATH PROJECT:SHARED_DATASET
  5. 要验证是否已添加授权数据集,请再次输入 bq show 命令。 例如:

    bq show --format=prettyjson PROJECT:SHARED_DATASET

API

  1. 通过调用 datasets.get 方法获取要共享的数据集的当前元数据,如下所示:

    GET https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT/datasets/SHARED_DATASET

    响应正文会返回包含数据集的 JSON 元数据的 Dataset 资源。

  2. 将要授权的数据集添加到 Dataset 资源中返回的 JSON 元数据的 access 部分中,如下所示:

    "access": [
     ...
     {
       "dataset": {
         "dataset": {
           "project_id": "PROJECT",
           "dataset_id": "AUTHORIZED_DATASET"
         },
         "target_types": "VIEWS"
       }
     }
    ]
  3. 使用 datasets.update 方法更新添加了授权的数据集:

    PUT https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT/datasets/SHARED_DATASET

    在请求正文中包含更新后的 Dataset 资源。

  4. 您可以再次调用 datasets.get 方法来验证是否已添加授权数据集。

撤消数据集的授权

删除已获授权访问其他源数据集的数据集后,最长可能需要 24 小时,相应更改才会完全反映在源数据集的访问控制列表 (ACL) 中。在此期间:

  • 您无法通过已删除的数据集访问源数据。
  • 已删除的数据集仍可能出现在源数据集的 ACL 中,并计入任何已获授权数据集的限制。这可能导致您在 ACL 更新之前无法创建新的已获授权数据集。

如需撤消授予授权数据集中的视图的访问权限,请从共享数据集的访问权限列表中移除该授权数据集,如下所示:

控制台

  1. 在 Google Cloud 控制台中,转到 BigQuery 页面。

    转到 BigQuery

  2. 浏览器面板中,展开您的项目并选择共享数据集。

  3. 点击 操作图标,然后选择打开

  4. 在显示的“详细信息”窗格中,点击共享并选择向数据集授权选项。

    在 Google Cloud 控制台中授权数据集

  5. 在显示的授权数据集窗格中,在当前授权数据集部分中找到授权数据集的条目。

  6. 点击您要移除的授权数据集旁边的删除图标,然后点击关闭

bq

  1. 打开 Cloud Shell:

    转到 Cloud Shell

  2. 使用 bq show 命令将共享数据集的现有元数据(包括访问控制列表)写入 JSON 文件中。

    bq show --format=prettyjson PROJECT:SHARED_DATASET > FILE_PATH
  3. 使用文本编辑器从在 FILE_PATH 创建的 JSON 文件的 access 部分中移除授权数据集,如下所示:

      {
        "dataset": {
          "dataset": {
            "project_id": "PROJECT",
            "dataset_id": "AUTHORIZED_DATASET"
          },
          "target_types": "VIEWS"
        }
      }
  4. 使用 bq update 命令更新共享数据集。例如:

    bq update --source FILE_PATH PROJECT:SHARED_DATASET
  5. 要验证授权数据集是否已被移除,请再次输入 bq show 命令。例如:

    bq show --format=prettyjson PROJECT:SHARED_DATASET

API

  1. 通过调用 datasets.get 方法获取共享数据集的当前元数据,如下所示:

    GET https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT/datasets/SHARED_DATASET

    响应正文会返回包含数据集的 JSON 元数据的 Dataset 资源。

  2. Dataset 资源中返回的 JSON 的 access 部分移除授权数据集,例如:

     {
       "dataset": {
         "dataset": {
           "project_id": "PROJECT",
           "dataset_id": "AUTHORIZED_DATASET"
         },
         "target_types": "VIEWS"
       }
     }
  3. 使用 datasets.update 方法更新移除了授权的数据集:

    PUT https://bigquery.googleapis.com/bigquery/v2/projects/PROJECT/datasets/SHARED_DATASET

    在请求正文中包含更新后的 Dataset 资源。

  4. 您可以再次调用 datasets.get 方法来验证授权数据集是否已被移除。

在授权数据集中创建或更新视图

如需创建或更新授权数据集中的视图,除了创建更新标准数据集中视图所需的权限,之外,您还必须具有所需的权限和角色中列出的共享数据集的权限。

下表汇总了创建或更新授权数据集中的视图所需的 Identity and Access Management (IAM) 权限

权限 资源
bigquery.datasets.get 您要共享的数据集。
bigquery.tables.getData 您要创建或更新的新视图中引用的共享数据集中的任何表或视图。
bigquery.tables.create 您要在其中创建视图的授权数据集。
bigquery.tables.update 您要在其中更新视图的授权数据集。

您无需具有任何额外权限即可从授权数据集中删除视图

在授权数据集中查询视图

如需查询授权数据集中的视图,用户需要有权访问该视图,但不需要访问共享数据集。

如需了解详情,请参阅已获授权的视图

授权数据集示例

以下示例介绍如何创建和使用授权数据集。

假设您有两个数据集,名为 private_datasetpublic_datasetprivate_dataset 数据集包含一个名为 private_table 的表。public_dataset 数据集包含一个名为 private_table_filtered 的视图。private_table_filtered 视图基于返回 private_table 表中部分字段(而非全部字段)的查询。

您可以向用户授予访问 private_table_filtered 视图返回的数据的权限,但不授予访问 private_table 表中所有数据的权限,如下所示:

  1. 向用户授予 public_dataset 数据集的 bigquery.dataViewer 角色。此角色包含 bigquery.tables.getData 权限,可让用户查询 public_dataset 数据集中的视图。如需了解如何向用户授予数据集的角色,请参阅控制对数据集的访问权限

    用户现在有权查询 public_dataset 中的视图,但仍然无法访问 private_dataset 中的 private_table 表。如果用户尝试直接查询 private_table 表,或者尝试通过查询 private_table_filtered 视图间接访问 private_table,则会收到错误消息,如下所示:

    Access Denied: Table PROJECT:private_dataset.private_table: User does not have permission to query table PROJECT:private_dataset.private_table.

  2. 在 Google Cloud 控制台的 BigQuery 页面中,打开 private_dataset 数据集,点击共享,然后选择向数据集授权

  3. 在显示的授权数据集窗格中,在数据集 ID 字段中输入 PROJECT.public_dataset,然后点击添加授权

    public_dataset 数据集添加到 private_dataset 数据集的访问控制列表中,从而授权 public_dataset 数据集中的视图查询 private_dataset 数据集中的数据。

    用户现在可以查询 public_dataset 数据集中的 private_table_filtered 视图,从而间接访问 private_dataset 数据集,而无需任何权限来直接访问 private_dataset 数据集中的数据。

限制

  • 您可以在不同区域创建授权数据集,但 BigQuery 不支持跨区域查询。因此,我们建议您在同一区域中创建数据集。

后续步骤

  • 如需了解如何授权单个视图访问数据集中的数据,请参阅授权视图

  • 如需了解如何授权表函数或用户定义的函数访问数据集中的数据,请参阅授权函数