已获授权的视图

本文档介绍如何在 BigQuery 中创建授权视图和授权物化视图。

概览

作为数据管理员,您可以创建授权视图,以将数据集中的数据子集共享给特定用户和群组(主账号)。主账号可以查看您共享的数据并对其运行查询,但无法直接访问源数据集。

视图类型

逻辑视图是 BigQuery 的默认视图类型,而物化视图是预计算视图,可定期缓存查询结果以提高性能和效率。

逻辑视图的授权视图称为授权视图,而物化视图的授权视图称为授权物化视图

如果逻辑视图依赖于大型查询或计算成本高的查询,则可以改为创建物化视图。不过,您通常可以通过仅查询数据子集或使用其他技巧来提高性能,而无需创建物化视图。

如需了解详情,请参阅以下资源:

创建授权视图的简要步骤

如需创建和共享视图,请查看以下简要步骤,这些步骤对于授权逻辑视图和授权物化视图都是相同的。

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

替代方案

虽然授权视图灵活且可扩缩,但以下方法之一可能更适合您的应用场景:

  • 为表设置行级政策。
  • 为表设置列级政策。
  • 将数据存储在单独的表中。
  • 共享数据集中的所有视图(授权数据集)。

使用行级或列级安全性,或使用单独的表

通过为表设置行级访问权限政策,或通过创建单独的表来保存敏感数据,数据管理员可以限制用户查看该数据的能力。将数据存储在单独的表中可隔离数据,并移除查看表中存在的行数的能力。

此外,通过创建和应用政策标记,数据管理员可以限制用户查看表中的列的能力。

将数据存储在单独的表中是最安全但最不灵活的方法。设置行级政策灵活且安全,而共享授权视图十分灵活且可提供最佳性能。

如需详细比较这些方法,请参阅以下资源:

共享数据集中的所有视图

如果要向一系列视图授予对某个数据集的访问权限,而无需为每个单独视图授权,可以将这些视图分组到一个数据集中,然后向包含这些视图的数据集授予访问包含相应数据的数据集的权限。

然后,您可以根据需要向主账号授予对包含视图群组的数据集的访问权限,或是授予对数据集中的个别视图的访问权限。有权访问另一个数据集的数据集称为“授权数据集”。授权另一个数据集访问其数据的数据集称为“共享数据集”

如需了解详情,请参阅授权数据集向数据集授权

限制

  • 在其他数据集中创建授权视图或授权物化视图时,源数据数据集和授权视图数据集必须位于同一区域级位置
  • 删除授权视图后,最长可能需要 24 小时才能从视图列表中移除授权视图。在此期间,您无法访问授权视图,但已删除的授权视图可以显示在视图列表中,并计入授权视图限制。如果新的授权视图超出此限制,则此限制可能会阻止创建其他授权视图。

准备工作

授予 Identity and Access Management (IAM) 角色,以便为用户提供查询您共享的授权视图或授权物化视图所需的权限。

所需的角色

如需创建或更新授权视图,您需要对包含该视图的数据集拥有权限,并对提供该视图访问权限的数据集拥有权限。

您还需要向用户或群组授予对包含视图的项目和数据集的访问权限。

对包含视图的数据集的管理员权限

在 BigQuery 中,视图作为表资源进行处理,因此创建视图所需的权限与创建表相同。您还必须拥有查询视图的 SQL 查询所引用的任何表的权限。

如需创建视图,您需要拥有 bigquery.tables.create IAM 权限。预定义的 IAM 角色 roles/bigquery.dataEditor 可提供创建视图所需的权限。

此外,如果您拥有 bigquery.datasets.create 权限,则可以在自己创建的数据集中创建视图。如需针对非自己拥有的数据创建视图,您必须拥有表的 bigquery.tables.getData 权限。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅预定义的角色和权限

对授予视图访问权限的第二个数据集的管理员权限

如需更新数据集属性,您需要拥有以下 IAM 权限:

  • bigquery.datasets.update
  • bigquery.datasets.setIamPolicy(仅当在 Google Cloud 控制台中更新数据集访问权限控制时才需要)

预定义的 IAM 角色 roles/bigquery.dataOwner 可提供更新数据集属性所需的权限。

此外,如果您拥有 bigquery.datasets.create 权限,则可以更新自己创建的数据集的属性。

如需详细了解 BigQuery 中的 IAM 角色和权限,请参阅预定义的角色和权限

对视图的对应项目和数据集的用户权限

如需与用户或群组共享授权视图,您必须向相应用户或群组授予以下 IAM 权限:

  • 包含授权视图的项目的 roles/bigquery.user IAM 角色。
  • 包含授权视图的数据集的 roles/bigquery.dataViewer IAM 角色。

使用授权视图

以下部分介绍了如何使用授权视图和授权物化视图。

创建授权视图

如需创建授权视图,请选择以下选项之一。如需查看用于授权、共享和删除授权视图的完整步骤,请参阅教程创建授权视图

控制台

  1. 前往 BigQuery 页面。

    转到 BigQuery

  2. 在查询编辑器中,输入您要用作授权视图的依据的查询。

  3. 点击保存 > 保存视图

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

    1. 对于项目,输入要将视图保存到其中的项目。

    2. 对于数据集,输入要将视图保存到其中的数据集。此数据集必须与源查询中使用的数据集不同。

    3. 对于,输入视图的名称。

    4. 点击保存

  5. 向可以使用授权视图的用户授予必要权限

  6. 探索器窗格中,选择源查询中使用的数据集。

  7. 详细信息窗格中,点击共享 > 向视图授权

  8. 已获授权的视图窗格中,对于授权视图,输入视图的完全限定名称,格式为 PROJECT_ID.DATASET_ID.VIEW_NAME

  9. 点击添加授权

Terraform

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

# Creates an authorized view.

# Create a dataset to contain the view.
resource "google_bigquery_dataset" "view_dataset" {
  dataset_id  = "view_dataset"
  description = "Dataset that contains the view"
  location    = "us-west1"
}

# Create the view to authorize.
resource "google_bigquery_table" "movie_view" {
  project     = google_bigquery_dataset.view_dataset.project
  dataset_id  = google_bigquery_dataset.view_dataset.dataset_id
  table_id    = "movie_view"
  description = "View to authorize"

  view {
    query          = "SELECT item_id, avg(rating) FROM `movie_project.movie_dataset.movie_ratings` GROUP BY item_id ORDER BY item_id;"
    use_legacy_sql = false
  }
}


# Authorize the view to access the dataset
# that the query data originates from.
resource "google_bigquery_dataset_access" "view_authorization" {
  project    = "movie_project"
  dataset_id = "movie_dataset"

  view {
    project_id = google_bigquery_table.movie_view.project
    dataset_id = google_bigquery_table.movie_view.dataset_id
    table_id   = google_bigquery_table.movie_view.table_id
  }
}

# Specify the IAM policy for principals that can access
# the authorized view. These users should already
# have the roles/bigqueryUser role at the project level.
data "google_iam_policy" "principals_policy" {
  binding {
    role = "roles/bigquery.dataViewer"
    members = [
      "group:example-group@example.com",
    ]
  }
}

# Set the IAM policy on the authorized  view.
resource "google_bigquery_table_iam_policy" "authorized_view_policy" {
  project     = google_bigquery_table.movie_view.project
  dataset_id  = google_bigquery_table.movie_view.dataset_id
  table_id    = google_bigquery_table.movie_view.table_id
  policy_data = data.google_iam_policy.principals_policy.policy_data
}

如需在 Google Cloud 项目中应用 Terraform 配置,请完成以下部分中的步骤。

准备 Cloud Shell

  1. 启动 Cloud Shell
  2. 设置要应用 Terraform 配置的默认 Google Cloud 项目。

    您只需为每个项目运行一次以下命令,即可在任何目录中运行它。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    如果您在 Terraform 配置文件中设置显式值,则环境变量会被替换。

准备目录

每个 Terraform 配置文件都必须有自己的目录(也称为“根模块”)。

  1. Cloud Shell 中,创建一个目录,并在该目录中创建一个新文件。文件名必须具有 .tf 扩展名,例如 main.tf。在本教程中,该文件称为 main.tf
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. 如果您按照教程进行操作,可以在每个部分或步骤中复制示例代码。

    将示例代码复制到新创建的 main.tf 中。

    (可选)从 GitHub 中复制代码。如果端到端解决方案包含 Terraform 代码段,则建议这样做。

  3. 查看和修改要应用到您的环境的示例参数。
  4. 保存更改。
  5. 初始化 Terraform。您只需为每个目录执行一次此操作。
    terraform init

    (可选)如需使用最新的 Google 提供程序版本,请添加 -upgrade 选项:

    terraform init -upgrade

应用更改

  1. 查看配置并验证 Terraform 将创建或更新的资源是否符合您的预期:
    terraform plan

    根据需要更正配置。

  2. 通过运行以下命令并在提示符处输入 yes 来应用 Terraform 配置:
    terraform apply

    等待 Terraform 显示“应用完成!”消息。

  3. 打开您的 Google Cloud 项目以查看结果。在 Google Cloud 控制台的界面中找到资源,以确保 Terraform 已创建或更新它们。

为授权视图管理用户或群组

向视图授权后,您可以通过对数据集、表或视图完成以下任务来维护针对其的访问权限:

  • 查看访问权限政策。
  • 授予访问权限。
  • 撤销访问权限。
  • 拒绝访问。

如需了解详情,请参阅使用 IAM 控制对资源的访问权限

移除视图授权

如需移除针对视图的授权,请选择以下选项之一:

控制台

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

    转到 BigQuery

  2. 浏览器窗格中,展开您的项目,然后选择数据集。

  3. 点击 共享 > 授权视图

  4. 点击 移除授权

  5. 点击关闭

bq

如需从视图移除授权,请使用 bq rm 命令。请输入要移除授权的视图的 table_id

    bq rm \
    project_id:dataset:table_id
    

API

调用 tables.delete 方法,并使用 projectIDdatasetIDtableID 属性移除数据集的授权视图。如需了解详情,请参阅

配额和限制

  • 获授权视图受到数据集限制的约束。如需了解详情,请参阅数据集限制
  • 如果您移除了某个授权视图,则最长可能需要 24 小时才会从系统中移除对该视图的所有引用。为避免出现错误,请先等待 24 小时,然后再重复使用已移除视图的名称,或者为您的视图创建唯一名称。

高级主题

以下部分介绍了使用授权视图的高级方法。

将行级安全性与授权视图相结合

逻辑视图或物化视图中显示的数据会根据底层源表的行级访问权限政策进行过滤。

如需详细了解行级安全性如何与物化视图交互,请参阅将行级安全性与其他 BigQuery 功能搭配使用

将列级安全性与授权视图相结合

列级安全性对视图的影响与视图是否为授权视图无关。

如需了解权限应用方式的详细说明,请参阅查询视图以了解列级安全性。

将 BigQuery Sharing 与授权视图搭配使用

BigQuery Sharing(以前称为 Analytics Hub)是一个数据交换平台,具有以下功能:

  • 可让您跨组织边界大规模共享数据和分析洞见。
  • 使用强大的安全和隐私保护框架。
  • 支持将 BigQuery 数据集(称为“共享数据集”)及其关联的授权视图和授权数据集发布给一组订阅方。

关联的数据集是一个只读 BigQuery 数据集,用作共享数据集的指针或引用。如果订阅 Sharing 列表,则会在您的项目中创建关联的数据集,而不是数据集的副本,因此订阅方可以读取数据,但无法在其中添加或更新对象。

不支持引用关联的数据集中的表的物化视图。

如需了解详情,请参阅 Sharing 简介

后续步骤