将行级安全性与其他 BigQuery 功能搭配使用

本文档介绍如何将行级访问权限安全性与其他 BigQuery 功能搭配使用。

在阅读本文档之前,请先阅读以下内容以熟悉行级安全性:BigQuery 行级安全性简介使用行级安全性

TRUE 过滤条件

行级访问权限政策可以过滤您在运行查询时看到的结果数据。如需运行非查询操作(例如 DML),您需要对表中的所有行具有完整访问权限。通过使用行访问政策并将过滤条件表达式设置为 TRUE 来授予完整访问权限。此行级访问权限政策称为 TRUE 过滤条件。

任何用户都可以被授予 TRUE 过滤条件访问权限,包括服务账号。

非查询操作的示例如下:

示例

创建 TRUE 过滤条件

CREATE ROW ACCESS POLICY all_access ON project.dataset.table1
GRANT TO ("group:all-rows-access@example.com")
FILTER USING (TRUE);

可与 TRUE 过滤条件搭配使用的功能

复制作业

如需复制表(该表具有一个或多个行级访问权限政策),您必须先获得授予对源表的 TRUE 过滤条件访问权限。源表的所有行级访问权限政策也会复制到新的目标表。如果您将没有行级访问权限政策的源表复制到具有行级访问权限政策的目标表,则系统会从目标表中移除行级访问权限政策(除非使用了 --append_table 标志或设置了 "writeDisposition": "WRITE_APPEND")。

允许跨区域复制,并复制所有政策。如果查询在子查询政策中包含无效的表引用,则在复制完成后,后续查询可能会中断。

表的行级访问权限政策必须具有唯一名称。如果在复制期间行级访问权限政策名称发生冲突,将导致无效的输入错误。

复制具有行级访问权限政策的表所需的权限

如需复制具有一个或多个行级访问策略的表,除了用于复制表和分区的角色之外,您还必须具有以下权限。

权限 资源
bigquery.rowAccessPolicies.list 源表。
bigquery.rowAccessPolicies.getIamPolicy 源表。
TRUE 过滤条件 源表。
bigquery.rowAccessPolicies.create 目标表。
bigquery.rowAccessPolicies.setIamPolicy 目标表。

BigQuery API 中的 Tabledata.list

您需要拥有 TRUE 过滤条件访问权限,才能在具有行级访问权限政策的表上使用 BigQuery API 中的 tabledata.list 方法。

DML

如需执行更新具有行级访问权限政策的表的 DML 语句,您需要具有该表的 TRUE 过滤条件。

特别是,MERGE 语句会按如下方式与行级访问权限政策搭配使用:

  • 如果目标表包含行级访问权限政策,则您需要对目标表具备 TRUE 过滤条件访问权限。
  • 如果源表包含行级访问权限政策,则 MERGE 语句仅对用户可见的行执行操作。

表快照

表快照支持行级安全性。在复制具有行级访问权限政策的表时所需的权限中介绍了基表(源表)和表快照(目标表)所需的权限。

包含 JSON 列的 BigQuery 表

无法对 JSON 列应用行级访问权限政策。如需详细了解行级安全性的限制,请参阅限制

BigQuery BI Engine 和 Looker 数据洞察

BigQuery BI Engine 不会加速在具有一个或多个行级访问政策的表上运行的查询;这些查询在 BigQuery 中作为标准查询运行。

Looker 数据洞察信息中心中的数据会根据底层源表的行级访问政策进行过滤。

列级别安全性

行级安全性和列级安全性(包括列级访问权限控制动态数据遮盖)完全兼容。

要点如下:

  • 您可以应用行级访问权限政策来过滤任意列中的数据,即使您无权访问该列中的数据也是如此。
    • 若尝试使用子查询行级访问权限政策访问这些列,则将导致错误,指示访问被拒绝。这些列不被视为系统引用的列。
    • 若尝试使用非子查询行级访问权限政策访问这些列,则会绕过列级安全性。
  • 如果列因列级安全性而受到限制,并且在查询的 SELECT 语句或子查询行级访问权限政策中指定了该列,您会收到错误。
  • 列级安全性也适用于 SELECT * 查询语句。SELECT * 的处理方式与明确指定受限列的查询相同。

行级安全性和列级安全性交互示例

本示例将逐步说明如何保护表,然后进行查询。

数据

假设您对 my_dataset 数据集(该数据集包含具有三个列的表 my_table)具有 DataOwner 角色。该表包含下表中显示的数据。

在此示例中,一个用户是 Alice,其电子邮件地址是 alice@example.com。第二个用户是 Bob、Alice 的同事。

rank 水果 颜色
1 苹果 红色
2 橙色 橙色
3 柠檬 黄色
4 绿黄色 绿色

安全性

您希望 Alice 能够看到 rank 列中的所有奇数行,看不到偶数行。您不希望 Bob 看到任何行,无论是偶数行还是奇数行。您不希望任何人看到 fruit 列中的任何数据。

  • 为了限制 Alice 看到偶数行,您创建一个行级访问权限政策,其包含一个基于 rank 列中显示的数据的过滤条件表达式。为了阻止 Bob 看到偶数行或奇数行,您未将他包括在被授权者列表中。

    CREATE ROW ACCESS POLICY only_odd ON my_dataset.my_table GRANT
    TO ('user:alice@example.com') FILTER USING (MOD(rank, 2) = 1);
    
  • 为了限制所有用户看到名为 fruit 的列中的数据,您创建列级安全性政策标记,以禁止所有用户访问该列的任何数据。

最后,您还可通过两种方法限制对名为 color 列的访问权限:列受到禁止任何人的所有访问的列级安全性政策标记约束,并且受到会过滤 color 列中的某些行数据的行级访问政策影响。

  • 第二个行级访问权限政策仅显示 color 列中值为 green 的行。

    CREATE ROW ACCESS POLICY only_green ON my_dataset.my_table
    GRANT TO ('user:alice@example.com') FILTER USING (color="green");
    

Bob 的查询

如果小艾的同事小博尝试查询 my_dataset.my_table 中的数据,则他将看不到任何行,因为小博不在该表的任何行级访问政策的被授权者列表中。

查询 my_dataset.my_table 注释
rank

(部分数据受行访问权限政策 only_odd 影响)
fruit

(所有数据均受 CLS 政策标记保护)
color

(所有数据均受 CLS 政策标记保护,并且部分数据受行访问权限政策 only_green 影响)
SELECT rank FROM my_dataset.my_table
返回 (0) 行。
Bob 不在行级访问政策的授权对象列表中;因此,此查询会成功,但不会返回行数据。

系统会向 Bob 显示一条消息,指出他的结果可能会被行访问权限政策过滤。

Alice 的查询

在 Alice 运行查询以访问 my_dataset.my_table 中的数据时,她的结果取决于她运行的查询和安全性,如下表所示。

查询 my_dataset.my_table 注释
rank

(部分数据受行访问权限政策 only_odd 影响)
fruit

(所有数据均受 CLS 政策标记保护)
color

(所有数据均受 CLS 政策标记保护,并且部分数据受行访问权限政策 only_green 影响)

SELECT rank FROM my_dataset.my_table


返回 (2) 个奇数行。
Alice 在排名列数据的 only_odd 行级访问权限政策的授予者列表中。因此,Alice 只会看到奇数行数据。偶数行被名为 only_odd 的行级访问权限政策隐藏。

系统会向 Alice 显示一条消息,指出她的结果可能会被行访问权限政策过滤。

SELECT fruit FROM my_dataset.my_table


access denied

在查询中明确指定了 fruit 列。

系统会应用列级安全性。

访问遭拒。

SELECT color FROM my_dataset.my_table


access denied

在查询中明确指定了 color 列。

系统会先应用列级安全性,然后才会应用针对 color 列中的数据的行级访问权限政策。

访问遭拒。

SELECT rank, fruit FROM my_dataset.my_table


access denied

在查询中显式指定了 fruit 列。

系统会先应用列级安全性,然后才会应用针对 rank 列中的数据的行级访问权限政策。

访问遭拒。

SELECT rank, color FROM my_dataset.my_table


access denied

在查询中显式指定了 color

系统会先应用针对 color 列的列级安全性,然后才应用针对 rankcolor 列中数据的行级访问权限政策。

访问遭拒。

SELECT fruit, color FROM my_dataset.my_table


access denied


access denied

在查询中显式指定了 fruitcolor 列。

系统会先应用针对 fruitcolor 列的列级安全性,然后才应用针对 color 列中数据的行级访问权限政策。

访问遭拒。

SELECT * FROM my_dataset.my_table


access denied


access denied

在查询中使用“SELECT *”隐式指定了 fruitcolor 列。

系统会先应用针对 fruitcolor 列的列级安全性,然后才应用针对 rankcolor 列中数据的行级访问权限政策。

访问遭拒。

TRUE 过滤条件访问权限

最后,如有关 TRUE 过滤条件访问权限的部分所述,如果 Alice 或 Bob 具有 TRUE 过滤条件访问权限,则他们可以看到该表中多有的行并将其用于非查询作业。但是,如果表具有列级别安全性,则它仍然适用,并且会影响结果。

执行图

您无法对具有行级访问权限政策的作业使用查询执行图

提取作业

如果表具有行级访问权限政策,则在运行提取作业时,只有您可以查看的数据会导出到 Cloud Storage。

旧版 SQL

行级访问权限政策与旧版 SQL 不兼容。对具有行级访问权限政策的表进行的查询必须使用 GoogleSQL。旧版 SQL 查询会被拒绝。

分区表和聚簇表

行级安全性不参与查询剪枝 (pruning),这是分区表的一项功能。

虽然行级安全性与分区表和聚簇表兼容,但在剪除分区期间系统不会应用过滤行数据的行级访问权限政策。您仍然可以通过指定对分区列执行操作的 WHERE 子句,对使用行级安全性的表执行分区剪除操作。同样,行级访问权限政策本身不会为针对聚簇表的查询带来任何性能优势,不过,这些政策也不会干扰您应用的其他过滤。

查询删减是在行级访问权限政策执行期间结合使用过滤条件和政策来执行的。

重命名表

您无需使用 TRUE 过滤条件访问权限来重命名设有一个或多个行访问权限政策的表。您可以使用 DDL 语句重命名表

作为替代方法,您还可以复制表并为目标表指定另一名称。如果源表具有行级访问权限政策,请参阅本页面上的表复制作业以了解详情。

流式传输更新

如需使用变更数据捕获执行流式传输表 UPDATEDELETE 操作,您必须拥有 TRUE 过滤条件访问权限。

时间旅行

只有表管理员才能访问具有或以前具有行级访问政策的表的历史数据。如果其他用户对具有行级访问权限的表使用时间旅行修饰器,则会收到 access denied 错误。如需了解详情,请参阅时间旅行和行级访问权限

视图和物化视图

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

此外,当具体化视图派生自具有行级访问政策的底层表时,查询性能与直接查询源表相同。换句话说,如果源表具有行级安全性,您将看不到查询物化视图相较于查询源表的典型性能优势。

您不能在行级访问权限政策中引用视图或具体化视图。

通配符查询

对具有行级访问权限政策的表进行通配符查询将会失败,并显示 INVALID_INPUT 错误。

后续步骤