创建授权视图


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

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

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

目标

  • 创建一个数据集来包含您的源数据。
  • 运行查询,将数据加载到源数据集中的目标表中。
  • 创建一个数据集来包含您的授权视图。
  • 通过 SQL 查询创建一个已获授权的视图,该视图用于限制数据分析师可在查询结果中看到的列。
  • 向数据分析师授予运行查询作业的权限。
  • 向数据分析师授予对包含授权视图的数据集的访问权限。
  • 向授权视图授予对源数据集的访问权限。

费用

在本文档中,您将使用 Google Cloud的以下收费组件:

您可使用价格计算器根据您的预计使用情况来估算费用。

新 Google Cloud 用户可能有资格申请免费试用

完成本文档中描述的任务后,您可以通过删除所创建的资源来避免继续计费。如需了解详情,请参阅清理

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  4. Verify that billing is enabled for your Google Cloud project.

  5. Enable the BigQuery API.

    Enable the API

  6. 确保您拥有必要的权限,以便执行本文档中的任务。
  7. 创建用于存储源数据的数据集

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

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

    控制台

    1. 转到 BigQuery 页面。

      转到 BigQuery

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

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

      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,然后点击 github_contributors

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

    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. 探索器面板中,选择您要在其中创建数据集的项目。

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

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

      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. 探索器窗格中,选择 shared_views 数据集以打开详情标签页。

    3. 点击 共享 > 权限

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

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

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

    7. 点击保存

    8. 点击关闭

    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. 探索器窗格中,选择 github_source_data 数据集以打开详情标签页。

    3. 依次点击共享 > 授权视图

    4. 已获授权的视图窗格中,在已获授权的视图字段中输入 PROJECT_ID.shared_views.github_analyst_view

      PROJECT_ID 替换为您的项目 ID。

    5. 点击添加授权

    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

    清理

    为避免因本教程中使用的资源导致您的 Google Cloud 账号产生费用,请删除包含这些资源的项目,或者保留项目但删除各个资源。

    删除项目

    控制台

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    gcloud

    1. In the Google Cloud console, go to the Manage resources page.

      Go to Manage resources

    2. In the project list, select the project that you want to delete, and then click Delete.
    3. In the dialog, type the project ID, and then click Shut down to delete the project.

    删除各个资源

    或者,如需移除本教程中使用的各个资源,请执行以下操作:

    1. 删除授权视图

    2. 删除包含已获授权的视图的数据集

    3. 删除源数据集中的表

    4. 删除源数据集

    由于您创建了本教程中使用的资源,因此无需其他权限即可将其删除。

    后续步骤