列级访问权限控制对写入的影响

本页面介绍了使用 BigQuery 列级访问权限控制来限制对列级数据的访问权限时对写入的影响。如需了解有关列级访问权限控制的一般信息,请参阅 BigQuery 列级访问权限控制简介

列级访问权限控制要求用户具有受政策标记保护的列的读取权限一些写入操作需要先读取列数据,然后才能实际写入列。为了执行这些操作,BigQuery 会检查用户的读取权限,以确保用户有权访问该列。例如,如果用户要更新数据(包括写入受保护列),则用户必须具有受保护列的读取权限。如果用户要插入新数据行(包含写入受保护列),则用户不需要受保护列的读取权限。但写入此类行的用户将无法读取新写入的数据,除非该用户具有受保护列的读取权限。

以下各部分详细介绍了不同类型的写入操作。本主题中的示例使用具有以下架构的 customers 表:

字段名称 类型 模式 政策标记
user_id STRING 必填 policy-tag-1
credit_score INTEGER 可以为空 policy-tag-2
ssn STRING 可以为空 policy-tag-3

使用 BigQuery 数据操纵语言 (DML)

插入数据

对于 INSERT 语句,BigQuery 不会在已扫描列或更新后的列中检查政策标记的 Fine-Grained Reader 权限。这是因为 INSERT 不需要读取任何列数据。但是,即便您已成功将值插入您无权读取的列,这些值一旦插入,也会按预期方式受到保护。

删除、更新和合并数据

对于 DELETEUPDATEMERGE 语句,BigQuery 会检查已扫描列的 Fine-Grained Reader 权限。除非您包含 WHERE 子句或者需要查询读取数据的某个其他子句或子查询,否则这些语句不会扫描列。

加载数据

在将数据(例如来自 Cloud Storage 或本地文件的数据)加载到表时,BigQuery 不会检查对目标表的列是否具备 Fine-Grained Reader 权限。这是因为加载数据不需要读取目标表内容。

将数据流式传输到 BigQuery 类似于 LOADINSERT。即使您没有 Fine-Grained Reader 权限,BigQuery 也能让您将数据流式传输到目标表列中。

复制数据

对于复制操作,BigQuery 会检查用户是否具有源表的 Fine-Grained Reader 权限。BigQuery 不会检查用户是否具有目标表列的 Fine-Grained Reader 权限。与 LOADINSERT 和流式传输一样,复制完成后,除非您具有目标表列的 Fine-Grained Reader 权限,否则您将无法读取刚才写入的数据。

DML 示例

INSERT

示例:

INSERT INTO customers VALUES('alice', 85, '123-456-7890');
源列 更新列
是否检查了政策标记的 Fine-Grained Reader 权限? 不适用
已检查列 不适用 user_id
credit_score
ssn

UPDATE

示例:

UPDATE customers SET credit_score = 0
  WHERE user_id LIKE 'alice%' AND credit_score < 30
源列 更新列
是否检查了政策标记的 Fine-Grained Reader 权限?
已检查列 user_id
credit_score
credit_score

DELETE

示例:

DELETE customers WHERE credit_score = 0
源列 更新列
是否检查了政策标记的 Fine-Grained Reader 权限?
已检查列 credit_score user_id
credit_score
ssn

加载示例

从本地文件或 Cloud Storage 加载

示例:

load --source_format=CSV samples.customers \
  ./customers_data.csv \
  ./customers_schema.json
源列 更新列
是否检查了政策标记的 Fine-Grained Reader 权限? 不适用
已检查列 不适用 user_id
credit_score
ssn

流式处理

使用旧版 insertAll 流式传输 API 或 Storage Write API 进行流式传输时,系统不会检查政策标记。对于 BigQuery 变更数据捕获,系统会检查主键列的政策标记。

复制示例

将数据附加到现有表

示例:

cp -a samples.customers samples.customers_dest
源列 更新列
是否检查了政策标记的 Fine-Grained Reader 权限?
已检查列 customers.user_id
customers.credit_score
customers.ssn
customers_dest.user_id
customers_dest.credit_score
customers_dest.ssn

将查询结果保存到目标表中

示例:

query --use_legacy_sql=false \
--max_rows=0 \
--destination_table samples.customers_dest \
--append_table "SELECT * FROM samples.customers LIMIT 10;"
源列 更新列
是否检查了政策标记的 Fine-Grained Reader 权限?
已检查列 customers.user_id
customers.credit_score
customers.ssn
customers_dest.user_id
customers_dest.credit_score
customers_dest.ssn