创建已获授权的视图

BigQuery 是一个 PB 级的分析数据仓库,可用于对大量数据近乎实时地运行 SQL 查询。

向视图授予访问数据集的权限也称为在 BigQuery 中创建已获授权的视图。借助已获授权的视图,您可以与特定用户和群组共享查询结果,而无需向其授予基础表的访问权限。您也可以使用视图的 SQL 查询来限制用户可查询的列(字段)。在本教程中,您将创建一个已获授权的视图。

目标

在本教程中,您将执行以下操作:

  • 创建数据集并对其应用访问权限控制
  • 向项目分配访问权限控制
  • 创建一个已获授权的视图,它用于限制用户可查询的数据

费用

BigQuery 是一款付费产品,本教程中涉及的操作将产生 BigQuery 使用费。BigQuery 提供每月 1 TB 的免费查询额度。如需了解详情,请参阅价格页面。

准备工作

开始学习本教程前,请先使用 Google Cloud Console 创建或选择项目。

  1. 登录您的 Google 帐号。

    如果您还没有 Google 帐号,请注册新帐号

  2. 在 GCP Console 的项目选择器页面上,选择或创建 GCP 项目。

    转到项目选择器页面

  3. 新项目会自动启用 BigQuery。 如需在现有项目中激活 BigQuery,请转到 启用BigQueryAPI。

    启用 API

  4. 如果您不想在项目中使用信用卡或启用结算功能,BigQuery 提供了沙盒机制。无论您的项目是否启用了结算功能,本主题中的步骤都适用。如果您想启用结算功能,请参阅了解如何启用结算功能

简介

在本教程中,您将创建两个数据集:一个数据集用于源数据,第二个数据集用于已获授权的视图。使用来自 GitHub 公开数据集的数据填充源数据集。然后创建在源数据集中查询表的视图。

创建数据集和视图后,您可以向项目、包含视图的数据集和包含源数据的数据集分配访问权限控制。

向视图授予访问源数据集的权限也称为创建已获授权的视图。在创建已获授权的视图时,请按照以下步骤操作:

  • 创建用于存储视图的单独数据集
  • 在新数据集中创建视图
  • 向项目分配访问权限控制
  • 分配对包含视图的数据集的访问权限控制
  • 向视图授予访问源数据集的权限

创建源数据集

首先,创建一个数据集来存储源数据。在本教程中,您将通过查询 GitHub 公开数据集填充源数据集中的表。源数据集中的数据包含您不希望数据分析师看到的信息。因此,您使用已获授权的视图来限制对数据的访问。

要创建源数据集,请执行以下操作:

控制台

  1. 在 Cloud Console 中打开 BigQuery 网页界面。
    转到 Cloud Console

  2. 在导航面板的资源部分中,选择您的项目并点击创建数据集。

  3. 对于数据集 ID,请键入 github_source_data

  4. 保留其他所有默认设置不变,然后点击创建数据集

Python

尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = 'github_source_data'

source_dataset = bigquery.Dataset(client.dataset(source_dataset_id))
# Specify the geographic location where the dataset should reside.
source_dataset.location = 'US'
source_dataset = client.create_dataset(source_dataset)  # API request

创建源数据集后,您可以使用 SQL 查询在其中填充表。此查询会从 GitHub 公开数据集中检索数据。

控制台

  1. 在 Cloud Console 中打开 BigQuery 网页界面。
    转到 Cloud Console

  2. 点击编写新查询

  3. 复制以下查询并粘贴到查询编辑器文本区域中。

    SELECT
      commit,
      author,
      committer,
      repo_name
    FROM
      `bigquery-public-data.github_repos.commits`
    LIMIT
      1000
    
  4. 点击更多,然后选择查询设置。

  5. 目标部分中,选中为查询结果设置目标表复选框。

    • 项目名称部分中,验证是否已选定您的项目。
    • 数据集名称部分中,请确保已选择 github_source_data
    • 表名称部分中,请键入 github_contributors
    • 点击保存

  6. 点击运行

  7. 完成查询后,点击 github_contributors,然后点击预览,验证数据是否已写入表中。

Python

尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

source_table_id = 'github_contributors'
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish

创建单独的数据集以存储视图

创建源数据集后,您可以新建一个数据集来存储要与数据分析师共享的视图。该视图将有权访问源数据集中的数据。您的数据分析师将有权访问视图,但无法访问源数据。

创建视图时,必须在与视图查询的源数据不同的数据集中创建该视图。您只能在数据集级层分配访问权限控制,因此如果在与源数据相同的数据集中创建视图,您的数据分析师将有权同时访问视图和数据。

要创建用于存储视图的数据集,请执行以下操作:

控制台

  1. 在 Cloud Console 中打开 BigQuery 网页界面。
    转到 Cloud Console

  2. 在导航面板的资源部分中,选择您的项目并点击创建数据集。

  3. 对于数据集 ID,请键入 shared_views

  4. 保留其他所有默认设置不变,然后点击创建数据集

Python

尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

shared_dataset_id = 'shared_views'
shared_dataset = bigquery.Dataset(client.dataset(shared_dataset_id))
shared_dataset.location = 'US'
shared_dataset = client.create_dataset(shared_dataset)  # API request

在新数据集中创建视图

在新数据集中,您可以创建想要授权的视图,即您与数据分析师共享的视图。该视图是使用 SQL 查询创建的,其中未包含您不希望数据分析师看到的列。

在本教程中,您的共享视图不包含除作者姓名以外的所有作者信息,且不包含除提交者姓名以外的所有提交者信息。

要在新数据集中创建视图,请执行以下操作:

控制台

  1. 在 Cloud Console 中打开 BigQuery 网页界面。
    转到 Cloud Console

  2. 点击编写新查询

  3. 复制以下查询并粘贴到查询编辑器文本区域中。将 project-id 替换为您的项目 ID

    SELECT
      commit,
      author.name as author,
      committer.name as committer,
      repo_name
    FROM
      `project_id.github_source_data.github_contributors`
    
  4. 点击更多,然后选择查询设置。

  5. SQL 方言下选择标准。点击保存以更新查询设置。

  6. 点击保存视图

  7. 保存视图对话框中,执行以下操作:

    • 项目名称部分中,验证是否已选定您的项目。
    • 数据集名称部分中,请确保已选择 shared_views
    • 表名称部分中,请键入 github_analyst_view
    • 点击保存

Python

尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

shared_view_id = 'github_analyst_view'
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

向数据分析师分配项目级 Cloud IAM 角色

为查询视图,您的数据分析师需要具有运行查询作业的权限。bigquery.user 角色包含在项目中运行作业(包括查询作业)的权限。如果您向用户或群组授予项目级层的 bigquery.user 角色,则用户可创建数据集,并可针对这些数据集中的表运行查询作业。bigquery.user 角色不针对用户尚未创建的数据集授予用户查询数据、查看表数据或查看表架构详细信息的权限。

向数据分析师分配项目级层的 bigquery.user 角色后,他们也无法查看或查询包含视图所查询的表的数据集中的表数据。应向企业中的大多数人(数据科学家、商业智能分析师和数据分析师)分配项目级层的 bigquery.user 角色。

在本教程中,您的数据分析师位于名为 data_analysts@example.com 的群组中。该群组名称仅用作举例。当您将群组添加到 IAM 角色时,电子邮件地址和网域必须与有效的 Google 帐号或 Google Apps 帐号关联。

要将数据分析师群组分配给项目级 bigquery.user 角色,请执行以下操作:

控制台

  1. 在 Google Cloud Console 中打开 IAM 网页。

    打开 IAM 页面

  2. 点击选择项目

  3. 选择您的项目,然后点击打开

  4. IAM 页面上,点击添加。

  5. 添加成员对话框中,执行以下操作:

    • 对于成员,请输入群组名称:data_analysts@example.com
    • 对于角色,点击选择角色,然后选择 BigQuery > BigQuery 用户。
    • 点击添加

分配对包含视图的数据集的访问权限控制

为了让数据分析师能够查询视图,需要针对包含该视图的数据集向他们授予 bigquery.dataViewer 角色。bigquery.user 角色为您的数据分析师提供创建查询作业所需的权限,但他们无法成功查询视图,除非他们还至少拥有对包含该视图的数据集的 bigquery.dataViewer 访问权限。

要向数据分析师提供对数据集的 bigquery.dataViewer 访问权限,请执行以下操作:

控制台

  1. 资源部分,选择 shared_views 数据集,然后点击共享数据集。

  2. 数据集权限面板中,点击添加成员。

  3. 新成员文本框中键入 data_analysts@example.com

  4. 点击选择角色,然后选择 BigQuery > BigQuery Data Viewer。

  5. 点击完成

Python

尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry('READER', 'groupByEmail', analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ['access_entries'])  # API request

向视图授予访问源数据集的权限

当您为包含视图的数据集创建访问权限控制后,会将视图添加为源数据集中已获授权的视图。这样,视图就可访问源数据,而数据分析师群组则无法访问。

要向视图授予访问源数据的权限,请执行以下操作:

控制台

  1. 资源中选择 github_source_data 数据集,然后点击共享数据集。

  2. 数据集权限面板中,点击已获授权的视图标签页。

  3. 共享已获授权的视图下:

    • 选择项目部分中,验证是否已选定您的项目。
    • 选择数据集部分中,请选择 shared_views
    • 选择视图部分中,请输入视图名称:github_analyst_view
    • 点击确定

  4. 点击添加,然后点击完成。

Python

尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, 'view', view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ['access_entries'])  # API request

验证配置

配置完成后,data_analysts 群组的成员可以通过查询视图来验证配置。

要验证配置,请执行以下操作:

控制台

  1. data_analysts 群组的成员转到 Cloud Console 中的 BigQuery 网页界面。
    转到 Cloud Console

  2. 点击编写新查询

  3. 复制以下查询并粘贴到查询编辑器文本区域中。

    SELECT
      *
    FROM
      `shared_views.github_analyst_view`
    

完整源代码

下面是本教程的完整源代码,供您参考。

Python

尝试此示例之前,请按照《BigQuery 快速入门:使用客户端库》中的 Python 设置说明进行操作。如需了解详情,请参阅 BigQuery Python API 参考文档

# Create a source dataset
from google.cloud import bigquery

client = bigquery.Client()
source_dataset_id = 'github_source_data'

source_dataset = bigquery.Dataset(client.dataset(source_dataset_id))
# Specify the geographic location where the dataset should reside.
source_dataset.location = 'US'
source_dataset = client.create_dataset(source_dataset)  # API request

# Populate a source table
source_table_id = 'github_contributors'
job_config = bigquery.QueryJobConfig()
job_config.destination = source_dataset.table(source_table_id)
sql = """
    SELECT commit, author, committer, repo_name
    FROM `bigquery-public-data.github_repos.commits`
    LIMIT 1000
"""
query_job = client.query(
    sql,
    # Location must match that of the dataset(s) referenced in the query
    # and of the destination table.
    location='US',
    job_config=job_config)  # API request - starts the query

query_job.result()  # Waits for the query to finish

# Create a separate dataset to store your view
shared_dataset_id = 'shared_views'
shared_dataset = bigquery.Dataset(client.dataset(shared_dataset_id))
shared_dataset.location = 'US'
shared_dataset = client.create_dataset(shared_dataset)  # API request

# Create the view in the new dataset
shared_view_id = 'github_analyst_view'
view = bigquery.Table(shared_dataset.table(shared_view_id))
sql_template = """
    SELECT
        commit, author.name as author,
        committer.name as committer, repo_name
    FROM
        `{}.{}.{}`
"""
view.view_query = sql_template.format(
    client.project, source_dataset_id, source_table_id)
view = client.create_table(view)  # API request

# Assign access controls to the dataset containing the view
# analyst_group_email = 'data_analysts@example.com'
access_entries = shared_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry('READER', 'groupByEmail', analyst_group_email)
)
shared_dataset.access_entries = access_entries
shared_dataset = client.update_dataset(
    shared_dataset, ['access_entries'])  # API request

# Authorize the view to access the source dataset
access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, 'view', view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ['access_entries'])  # API request

清理

为避免因本教程中使用的资源导致您的 Google Cloud Platform 帐号产生费用,请执行以下操作:

  1. 在 GCP Console 中,转到管理资源页面。

    转到“管理资源”页面

  2. 在项目列表中,选择您要删除的项目,然后点击删除 delete。
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤