Impact on writes from column-level access control
This page explains the impact to writes when you use BigQuery column-level access control to restrict access to data at the column level. For general information about column-level access control, see Introduction to BigQuery column-level access control.
Column-level access control requires a user to have read permission for columns that are protected by policy tags. Some write operations need to read column data before actually writing into a column. For those operations, BigQuery checks the user's read permission to ensure the user has access to the column. For example, if a user is updating data that includes writing to a protected column, the user must have read permission for the protected column. If the user is inserting a new data row that includes writing to a protected column, the user doesn't need read access for the protected column. But, the user who writes such a row won't be able to read the newly written data unless the user has read permission for the protected columns.
The following sections provide details about different types of write
operations. The examples in this topic use customers
tables with the following
schema:
Field name | Type | Mode | Policy tag |
---|---|---|---|
user_id |
STRING | REQUIRED | policy-tag-1 |
credit_score |
INTEGER | NULLABLE | policy-tag-2 |
ssn |
STRING | NULLABLE | policy-tag-3 |
Using BigQuery data manipulation language (DML)
Inserting data
For an INSERT
statement, BigQuery does not check Fine-Grained
Reader permission on the policy tags on either the scanned columns or the
updated columns. This is because an INSERT
does not require reading any of the
column data. But, even if you successfully insert values into columns where you
don't have read permission, once inserted, the values are protected as expected.
Deleting, updating, and merging data
For DELETE
, UPDATE
, and MERGE
statements, BigQuery checks
for the Fine-Grained Reader permission on the scanned columns. Columns aren't
scanned by these statements unless you include a
WHERE
clause,
or some other clause or subquery that requires the query to read data.
Loading data
When loading data (for example, from Cloud Storage or local files) to a table, BigQuery does not check the Fine-Grained Reader permission on the columns of the destination table. This is because loading data does not require reading content from the destination table.
Streaming into BigQuery is similar to LOAD
and INSERT
.
BigQuery lets you stream data into a destination table
column, even if you don't have the Fine-Grained Reader permission.
Copying data
For a copy operation, BigQuery checks whether the user has
the Fine-Grained Reader permission on the source table. BigQuery
does not check whether the user has the Fine-Grained Reader permission to the
columns in the destination table. Like LOAD
, INSERT
, and streaming,
once the copy is complete, you won't be able to read the data that was just
written, unless you have the Fine-Grained Reader permission to the destination
table's columns.
DML examples
INSERT
Example:
INSERT INTO customers VALUES('alice', 85, '123-456-7890');
Source columns | Update columns | |
---|---|---|
Policy tags checked for Fine-Grained Reader? | N/A | No |
Columns checked | N/A | user_id credit_score ssn |
UPDATE
Example:
UPDATE customers SET credit_score = 0
WHERE user_id LIKE 'alice%' AND credit_score < 30
Source columns | Update columns | |
---|---|---|
Policy tags checked for Fine-Grained Reader? | Yes | No |
Columns checked | user_id credit_score |
credit_score |
DELETE
Example:
DELETE customers WHERE credit_score = 0
Source columns | Update columns | |
---|---|---|
Policy tags checked for Fine-Grained Reader? | Yes | No |
Columns checked | credit_score |
user_id credit_score ssn |
Load examples
Loading from a local file or Cloud Storage
Example:
load --source_format=CSV samples.customers \
./customers_data.csv \
./customers_schema.json
Source columns | Update columns | |
---|---|---|
Policy tags checked for Fine-Grained Reader? | N/A | No |
Columns checked | N/A | user_id credit_score ssn |
Streaming
No policy tags are checked when streaming with the legacy insertAll
streaming API or the
Storage Write API. For BigQuery change data capture, the policy tags are checked on the primary key columns.
Copy examples
Appending data to an existing table
Example:
cp -a samples.customers samples.customers_dest
Source columns | Update columns | |
---|---|---|
Policy tags checked for Fine-Grained Reader? | Yes | No |
Columns checked | customers.user_id customers.credit_score customers.ssn |
customers_dest.user_id customers_dest.credit_score customers_dest.ssn |
Saving query results to a destination table
Example:
query --use_legacy_sql=false \
--max_rows=0 \
--destination_table samples.customers_dest \
--append_table "SELECT * FROM samples.customers LIMIT 10;"
Source columns | Update columns | |
---|---|---|
Policy tags checked for Fine-Grained Reader? | Yes | No |
Columns checked | customers.user_id customers.credit_score customers.ssn |
customers_dest.user_id customers_dest.credit_score customers_dest.ssn |