创建已获授权的视图

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

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

目标

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

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

费用

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

准备工作

在开始本教程之前,请使用 Google Cloud Platform Console 创建或选择项目并启用结算功能。

  1. 登录您的 Google 帐号。

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

  2. 选择或创建 Google Cloud Platform 项目。

    转到“管理资源”页面

  3. 确保您的 Google Cloud Platform 项目已启用结算功能。

    了解如何启用结算功能

  4. 新项目中会自动启用 BigQuery。要在预先存在的项目中激活 BigQuery,请运行以下命令: 启用 BigQuery API。

    启用 API

简介

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

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

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

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

创建源数据集

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

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

Console

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

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

  3. 对于数据集 ID,输入 github_source_data

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

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 在导航窗格中,点击项目名称旁边的向下箭头图标 向下箭头图标,然后点击 Create new dataset

  3. 对于 Dataset ID,输入 github_source_data

  4. 保留其他所有默认设置,然后点击 OK

命令行

使用 mk 命令创建数据集。

bq mk github_source_data

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 公开数据集中检索数据。

Console

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

  2. 点击编写新查询

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

    #standardSQL
    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,然后点击预览,验证数据是否已写入表中。

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 COMPOSE QUERY 按钮。

  3. 将以下查询复制粘贴到 New Query 文本区域中。

    #standardSQL
    SELECT
      commit,
      author,
      committer,
      repo_name
    FROM
      `bigquery-public-data.github_repos.commits`
    LIMIT
      1000
    
  4. 点击 Show Options

  5. Destination Table 部分,点击 Select Table

  6. Select Destination Table 对话框中,执行以下操作:

    • Project 部分,验证是否已选定您的项目。
    • Dataset 部分中,验证是否已选择了 github_source_data
    • Table ID 部分中,输入 github_contributors
    • 点击 Ok

  7. 点击 Run Query

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

命令行

query 命令与 --destination_table 标志结合使用,以将查询结果写入 github_source_data 数据集中的表。

bq query --destination_table=github_source_data.github_contributors --use_legacy_sql=false 'SELECT commit, author, committer, repo_name FROM
`bigquery-public-data.github_repos.commits` LIMIT 1000'

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

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

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

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

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

Console

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

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

  3. 对于数据集 ID,输入 shared_views

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

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 在导航窗格中,点击项目名称旁边的向下箭头图标 向下箭头图标,然后点击 Create new dataset

  3. 对于 Dataset ID,输入 shared_views

  4. 保留其他所有默认设置,然后点击 OK

命令行

使用 mk 命令创建数据集。

bq mk shared_views

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 查询创建的,其中未包含您不希望数据分析师看到的列。

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

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

Console

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

  2. 点击编写新查询

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

    #standardSQL
    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
    • 点击保存

经典版界面

  1. 转到 BigQuery 网页界面。

    转到 BigQuery 网页界面

  2. 点击 COMPOSE QUERY 按钮。

  3. 将以下查询复制粘贴到 New Query 文本区域中。将 [PROJECT_ID] 替换为您的项目 ID。

    #standardSQL
    SELECT
      commit,
      author.name as author,
      committer.name as committer,
      repo_name
    FROM
      `[PROJECT_ID].github_source_data.github_contributors`
    
  4. 点击 Show Options

  5. 取消选中 Use Legacy SQL

  6. 点击 Save View

  7. Save View 对话框中,执行以下操作:

    • Project 部分,验证是否已选定您的项目。
    • Dataset 部分中,验证是否已选择了 shared_views
    • Table ID 部分中,输入 github_analyst_view
    • 点击 Ok

命令行

结合使用 mk 命令和 --view 标志。将 [PROJECT_ID] 替换为您的项目 ID。

bq mk --use_legacy_sql=false --view='SELECT commit, author.name as author, committer.name as committer, repo_name FROM `[PROJECT_ID].github_source_data.github_contributors`' 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

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

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

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

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

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

Console

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

    打开 IAM 页面

  2. 点击选择项目

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

  4. IAM 页面上,点击添加

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

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

经典版界面

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

    打开 IAM 页面

  2. 点击选择项目

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

  4. IAM 页面上,点击添加

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

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

命令行

  1. 要将单个绑定添加到项目的 IAM 政策,请输入以下命令。将 [PROJECT_ID] 替换为您的项目 ID。

    gcloud projects add-iam-policy-binding [PROJECT_ID] --member group:data_analysts@example.com --role roles/bigquery.user
    
  2. 该命令会输出更新后的政策:

    bindings:
    - members:
      - group:data_analysts@example.com
        role: roles/BigQuery.user
    

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

数据分析师需要对包含视图的数据集具有 READER 访问权限才可查询视图。bigquery.user 角色向数据分析师提供创建查询作业所需的权限,但他们至少还必须对包含视图的数据集具有 READER 访问权限,才能成功查询视图。

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

Console

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

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

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

  4. 点击选择角色并选择 Viewer。这将映射到数据集级层的 bigquery.dataViewer 角色。

  5. 点击保存,然后点击完成

经典版界面

  1. 点击 shared_views 数据集右侧的下拉箭头,然后选择 Share Dataset

  2. Share Dataset 对话框中的 Add People 部分,点击该字段左侧的下拉列表,然后选择 Group by e-mail

  3. 在文本框中输入 data_analysts@example.com

  4. Add People 字段的右侧,验证是否选择了 Can view。“Can View”会映射到数据集级别的 bigquery.dataViewer 角色。

  5. 点击 Add,然后点击 Save changes

命令行

  1. 当您使用命令行工具向数据集应用访问权限控制时,现有的控制会被覆盖。首先,请使用 show 命令将现有访问权限控制导出到 JSON 文件。

    bq --format=json show shared_views >shared_views.json
    
  2. 使用 READER 角色和 groupByEmail 对 JSON 文件的“access”部分进行更改。

    例如:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "role": "WRITER",
       "specialGroup": "projectWriters"
      },
      {
       "role": "OWNER",
       "specialGroup": "projectOwners"
      }
      {
       "role": "READER",
       "specialGroup": "allAuthenticatedUsers"
      }
      {
       "role": "READER",
       "domain": "[DOMAIN_NAME]"
      }
      {
       "role": "WRITER",
       "userByEmail": "[USER_EMAIL]"
      }
      {
       "role": "READER",
       "groupByEmail": "data_analysts@example.com"
      }
     ],
    }
    

  3. 修改完成后,使用 update 命令并使用 --source 标志包含 JSON 文件。

    bq update --source=shared_views.json shared_views

  4. 要验证访问权限控制是否发生了变化,请使用 show 命令。

    bq show shared_views

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

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

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

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

Console

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

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

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

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

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

经典版界面

  1. 点击 github_source_data 数据集右侧的下拉箭头,然后选择 Share Dataset

  2. Share Dataset 对话框中的 Add People 部分,点击该字段左侧的下拉列表,然后选择 Authorized View

  3. 点击 Select View

  4. Select View 对话框中,执行以下操作:

    • Project 部分中,验证是否已选定您的项目。
    • Dataset 部分中,选择 shared_views
    • Table ID 部分中,输入视图名称:github_analyst_view
    • 点击确定

  5. 点击添加,然后点击保存更改

命令行

  1. 当您使用 CLI 向数据集应用访问权限控制时,现有的控制会被覆盖。首先,请使用 show 命令将现有访问权限控制导出到 JSON 文件。

    bq --format=prettyjson show github_source_data >github_source_data.json
    
  2. 将已获授权的视图添加到 JSON 文件的“access”部分。将 [PROJECT_ID] 替换为您的项目 ID。

    例如:

    {
     "access": [
      {
       "role": "READER",
       "specialGroup": "projectReaders"
      },
      {
       "view":{
       "datasetId": "shared_views",
       "projectId": "[PROJECT_ID]",
       "tableId": "github_analyst_view"
       }
      },
      ...
     ],
     ...
    }
    

    为简洁起见,省略了 JSON 文件中的部分文本。

  3. 修改完成后,使用 update 命令并使用 --source 标志包含 JSON 文件。

    bq update --source=github_source_data.json github_source_data

  4. 要验证访问权限控制是否发生了变化,请使用 show 命令。

    bq show github_source_data

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 群组的成员可以通过查询视图来验证配置。

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

Console

  1. data_analysts 群组的一名成员在 GCP Console 中打开 BigQuery 网页界面。
    转到 BigQuery 网页界面

  2. 点击编写新查询按钮。

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

    #standardSQL
    SELECT
      *
    FROM
      `shared_views.github_analyst_view`
    

经典版界面

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

    转到 BigQuery 网页界面

  2. 点击 COMPOSE QUERY 按钮。

  3. 将以下查询复制粘贴到 New Query 文本区域中。

    #standardSQL
    SELECT
      *
    FROM
      `shared_views.github_analyst_view`
    

命令行

使用 query 命令查询视图。

bq query --use_legacy_sql=false '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. 在项目列表中,选择要删除的项目,然后点击删除
  3. 在对话框中输入项目 ID,然后点击关闭以删除项目。

后续步骤

此页内容是否有用?请给出您的反馈和评价:

发送以下问题的反馈:

此网页