创建授权视图

在本教程中,您将在 BigQuery 中创建一个供数据分析师使用的授权视图。授权视图可让您与特定用户和群组共享查询结果,而无需为其授予底层源数据的访问权限。此视图已获得源数据(而不是用户或群组)的访问权限。您还可以使用视图的 SQL 查询从查询结果中排除列和字段。

使用授权视图的另一种方法是在源数据上设置列级访问权限控制,然后向用户授予对查询受访问权限控制的数据的视图的访问权限。如需详细了解列级访问权限控制,请参阅列级访问权限控制简介

如果您有多个授权视图访问同一源数据集,则可以授权包含这些视图的数据集,而不是授权单个视图。

创建用于存储源数据的数据集

首先,创建一个数据集来存储源数据。

如需创建源数据集,请选择以下选项之一:

控制台

  1. 前往 BigQuery 页面。

    转到 BigQuery

  2. 在左侧窗格中,点击 Explorer

    突出显示的“探索器”窗格按钮。

    如果您没有看到左侧窗格,请点击 展开左侧窗格以打开该窗格。

  3. 探索器窗格中,点击您要创建数据集的项目旁边的 查看操作 > 创建数据集

  4. 创建数据集 页面上,执行以下操作:

    1. 数据集 ID 部分,输入 github_source_data

    2. 对于位置类型,验证选择了多区域

    3. 对于多区域,请选择美国欧盟。您在本教程中创建的所有资源都应位于同一多区域位置。

    4. 点击创建数据集

SQL

使用 CREATE SCHEMA DDL 语句

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

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE SCHEMA github_source_data;

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

Java

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

from google.cloud import bigquery
from google.cloud.bigquery.enums import EntityTypes

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)


source_dataset = bigquery.Dataset(source_dataset_id_full)
# 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. 前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中输入以下查询:

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

  4. 对于目标,选择为查询结果设置目标表

  5. 对于数据集,输入 PROJECT_ID.github_source_data

    PROJECT_ID 替换为您的项目 ID。

  6. 对于表 ID,输入 github_contributors

  7. 点击保存

  8. 点击运行

  9. 查询完成后,在探索器窗格中,点击数据集,然后点击 github_source_data 数据集。

  10. 依次点击概览 >,然后点击 github_contributors 表。

  11. 如需验证数据是否已写入表中,请点击预览标签页。

Java

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

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
"""
client.query_and_wait(
    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 and waits for query to finish

创建用于存储授权视图的数据集

创建源数据集后,您需要创建一个新的独立数据集,以存储要与数据分析师共享的授权视图。在稍后的步骤中,您将向授权视图授予对源数据集内数据的访问权限。您的数据分析师将有权访问授权视图,但无权直接访问源数据。

授权视图应在与源数据不同的数据集中创建。 这样,数据所有者可以为用户提供对授权视图的访问权限,而无需同时授予对底层数据的访问权限。源数据数据集和授权视图数据集必须位于同一地区位置

如需创建用于存储视图的数据集,请选择以下选项之一:

控制台

  1. 前往 BigQuery 页面。

    转到 BigQuery

  2. 在左侧窗格中,点击 Explorer

    突出显示的“探索器”窗格按钮。

  3. 探索器窗格中,选择您要在其中创建数据集的项目。

  4. 展开 查看操作选项,然后点击创建数据集

  5. 创建数据集 页面上,执行以下操作:

    1. 数据集 ID 部分,输入 shared_views

    2. 对于位置类型,验证选择了多区域

    3. 对于多区域,请选择美国欧盟。您在本教程中创建的所有资源都应位于同一多区域位置。

    4. 点击创建数据集

SQL

使用 CREATE SCHEMA DDL 语句

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

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE SCHEMA shared_views;

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

Java

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)


shared_dataset = bigquery.Dataset(shared_dataset_id_full)
shared_dataset.location = "US"
shared_dataset = client.create_dataset(shared_dataset)  # API request

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

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

github_contributors 源表包含以下两个 RECORD 类型的字段:authorcommitter。在本教程中,您的授权视图不包含除作者姓名以外的所有作者数据,且不包含除提交者姓名以外的所有提交者数据。

如需在新数据集中创建视图,请选择以下选项之一:

控制台

  1. 前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下查询。

    SELECT
    commit,
    author.name AS author,
    committer.name AS committer,
    repo_name
    FROM
    `PROJECT_ID.github_source_data.github_contributors`;

    PROJECT_ID 替换为您的项目 ID。

  3. 点击保存 > 保存视图

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

    1. Project 部分中,验证是否已选定您的项目。

    2. 对于数据集,输入 shared_views

    3. 对于,输入 github_analyst_view

    4. 点击保存

SQL

使用 CREATE VIEW DDL 语句

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

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    CREATE VIEW shared_views.github_analyst_view
    AS (
      SELECT
        commit,
        author.name AS author,
        committer.name AS committer,
        repo_name
      FROM
        `PROJECT_ID.github_source_data.github_contributors`
    );

    PROJECT_ID 替换为您的项目 ID。

  3. 点击 运行

如需详细了解如何运行查询,请参阅运行交互式查询

Java

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

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

向数据分析师授予运行查询作业的权限

为了查询视图,您的数据分析师需要拥有 bigquery.jobs.create 权限才能运行查询作业,并且需要获得对该视图的访问权限。在此部分中,您将向数据分析师授予 bigquery.user 角色。bigquery.user 角色包含 bigquery.jobs.create 权限。在稍后的步骤中,您将向数据分析师授予访问该视图的权限。

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

  1. 在 Google Cloud 控制台中,前往 IAM 页面。

    转到 IAM

  2. 确保在项目选择器中选择您的项目。

  3. 点击 授予访问权限

  4. 授予访问权限对话框中,执行以下操作:

    1. 新的主账号字段中,输入包含数据分析师的群组。例如,data_analysts@example.com

    2. 选择角色字段中,搜索 BigQuery User 角色并将其选中。

    3. 点击保存

向数据分析师授予查询授权视图的权限

为了让数据分析师能够查询视图,需要在数据集级或视图级向他们授予 bigquery.dataViewer 角色。在数据集级授予此角色后,分析师便可访问数据集中的所有表和视图。由于本教程中创建的数据集仅包含一个授权视图,因此您将在数据集级予访问权限。如果您有一系列需要授予访问权限的授权视图,请考虑改用授权数据集

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

如需向数据分析师授予对包含授权视图的数据集的 bigquery.dataViewer 访问权限,请执行以下操作:

控制台

  1. 前往 BigQuery 页面。

    转到 BigQuery

  2. 在左侧窗格中,点击 Explorer

    突出显示的“探索器”窗格按钮。

  3. 探索器窗格中,点击数据集,然后选择 shared_views 数据集以打开详细信息标签页。

  4. 点击 共享 > 权限

  5. 共享权限窗格中,点击添加主账号

  6. 对于新的主账号,输入包含数据分析师的群组,例如 data_analysts@example.com

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

  8. 点击保存

  9. 点击关闭

Java

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

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

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

为包含授权视图的数据集创建访问权限控制后,您需要向授权视图授予对源数据集的访问权限。此授权为视图(而非数据分析师群组)提供对源数据的访问权限。

如需向授权视图授予对源数据的访问权限,请选择以下选项之一:

控制台

  1. 前往 BigQuery 页面。

    转到 BigQuery

  2. 在左侧窗格中,点击 Explorer

    突出显示的“探索器”窗格按钮。

  3. 探索器窗格中,点击数据集,然后选择 github_source_data 数据集以打开详细信息标签页。

  4. 点击共享 > 授权视图

  5. 授权视图窗格中,对于授权视图,输入 PROJECT_ID.shared_views.github_analyst_view

    PROJECT_ID 替换为您的项目 ID。

  6. 点击添加授权

Java

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

access_entries = source_dataset.access_entries
access_entries.append(
    bigquery.AccessEntry(None, EntityTypes.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. 前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入以下语句:

    SELECT
      *
    FROM
      `PROJECT_ID.shared_views.github_analyst_view`;

    PROJECT_ID 替换为您的项目 ID。

  3. 点击 运行

查询结果类似于以下内容。结果中仅显示作者姓名和提交者姓名。

查询授权视图后的查询结果

如需详细了解如何运行查询,请参阅运行交互式查询

完整源代码

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

Java

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

// Create a source dataset to store your table.
Dataset sourceDataset = bigquery.create(DatasetInfo.of(sourceDatasetId));

// Populate a source table
String tableQuery =
    "SELECT commit, author, committer, repo_name"
        + " FROM `bigquery-public-data.github_repos.commits`"
        + " LIMIT 1000";
QueryJobConfiguration queryConfig =
    QueryJobConfiguration.newBuilder(tableQuery)
        .setDestinationTable(TableId.of(sourceDatasetId, sourceTableId))
        .build();
bigquery.query(queryConfig);

// Create a separate dataset to store your view
Dataset sharedDataset = bigquery.create(DatasetInfo.of(sharedDatasetId));

// Create the view in the new dataset
String viewQuery =
    String.format(
        "SELECT commit, author.name as author, committer.name as committer, repo_name FROM %s.%s.%s",
        projectId, sourceDatasetId, sourceTableId);

ViewDefinition viewDefinition = ViewDefinition.of(viewQuery);

Table view =
    bigquery.create(TableInfo.of(TableId.of(sharedDatasetId, sharedViewId), viewDefinition));

// Assign access controls to the dataset containing the view
List<Acl> viewAcl = new ArrayList<>(sharedDataset.getAcl());
viewAcl.add(Acl.of(new Acl.Group("example-analyst-group@google.com"), Acl.Role.READER));
sharedDataset.toBuilder().setAcl(viewAcl).build().update();

// Authorize the view to access the source dataset
List<Acl> srcAcl = new ArrayList<>(sourceDataset.getAcl());
srcAcl.add(Acl.of(new Acl.View(view.getTableId())));
sourceDataset.toBuilder().setAcl(srcAcl).build().update();

Python

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

如需向 BigQuery 进行身份验证,请设置应用默认凭证。如需了解详情,请参阅为客户端库设置身份验证

# Create a source dataset
from google.cloud import bigquery
from google.cloud.bigquery.enums import EntityTypes

client = bigquery.Client()
source_dataset_id = "github_source_data"
source_dataset_id_full = "{}.{}".format(client.project, source_dataset_id)


source_dataset = bigquery.Dataset(source_dataset_id_full)
# 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
"""
client.query_and_wait(
    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 and waits for query to finish

# Create a separate dataset to store your view
shared_dataset_id = "shared_views"
shared_dataset_id_full = "{}.{}".format(client.project, shared_dataset_id)


shared_dataset = bigquery.Dataset(shared_dataset_id_full)
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", EntityTypes.GROUP_BY_EMAIL, 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, EntityTypes.VIEW, view.reference.to_api_repr())
)
source_dataset.access_entries = access_entries
source_dataset = client.update_dataset(
    source_dataset, ["access_entries"]
)  # API request