資料欄層級存取權控管對寫入作業的影響

本頁說明使用 BigQuery 資料欄層級存取權控管機制,限制資料欄層級的資料存取權時,對寫入作業的影響。如要瞭解資料欄層級存取權控管的一般資訊,請參閱「BigQuery 資料欄層級存取權控管簡介」。

資料欄層級存取權控管功能要求使用者具備政策標記所保護資料欄的讀取權限。部分寫入作業需要先讀取資料欄資料,才能實際寫入資料欄。針對這些作業,BigQuery 會檢查使用者的讀取權限,確保使用者可以存取該欄。舉例來說,如果使用者要更新資料,而該資料包含寫入受保護欄的內容,則使用者必須具備該受保護欄的讀取權限。如果使用者要插入新資料列,而該列包含寫入受保護資料欄的權限,使用者就不需要該資料欄的讀取權限。不過,如果使用者沒有受保護欄位的讀取權限,就無法讀取新寫入的資料。

以下各節將詳細說明不同類型的寫入作業。本主題的範例使用 customers 資料表,其結構定義如下:

欄位名稱 類型 模式 政策標記
user_id STRING 必填 policy-tag-1
credit_score INTEGER NULLABLE policy-tag-2
ssn STRING NULLABLE policy-tag-3

使用 BigQuery 資料操縱語言 (DML)

插入資料

對於 INSERT 陳述式,BigQuery 不會檢查掃描資料欄或更新資料欄的政策標記上的精細讀取權限。這是因為 INSERT 不需要讀取任何資料欄資料。不過,即使您成功在沒有讀取權限的資料欄中插入值,插入後,系統仍會依預期保護這些值。

刪除、更新及合併資料

針對 DELETEUPDATEMERGE 陳述式,BigQuery 會檢查掃描資料欄的「精細讀取者」權限。除非您加入 WHERE 子句,或是其他需要查詢讀取資料的子查詢,否則這些陳述式不會掃描資料欄。

正在載入資料

將資料 (例如從 Cloud Storage 或本機檔案) 載入至資料表時,BigQuery 不會檢查目的地資料表的資料欄上是否有精細讀取者權限。這是因為載入資料不需要讀取目的地資料表的內容。

將資料串流至 BigQuery 的做法與 LOADINSERT 類似。即使您沒有精細讀取者權限,BigQuery 仍可讓您將資料串流至目的地資料表資料欄。

複製資料

對於複製作業,BigQuery 會檢查使用者是否具備來源資料表的精細讀取者權限。BigQuery 不會檢查使用者是否具備目的地資料表中資料欄的精細讀取者權限。如同 LOADINSERT 和串流,一旦複製作業完成,您就無法讀取剛寫入的資料,除非您對目的地資料表的欄位擁有精細讀取權限。

DML 範例

INSERT

範例:

INSERT INTO customers VALUES('alice', 85, '123-456-7890');
來源欄 更新資料欄
是否已勾選精細讀取者政策標記? 不適用
已勾選的資料欄 不適用 user_id
credit_score
ssn

UPDATE

範例:

UPDATE customers SET credit_score = 0
  WHERE user_id LIKE 'alice%' AND credit_score < 30
來源欄 更新資料欄
是否已勾選精細讀取者政策標記?
已勾選的資料欄 user_id
credit_score
credit_score

DELETE

範例:

DELETE customers WHERE credit_score = 0
來源欄 更新資料欄
是否已勾選精細讀取者政策標記?
已勾選的資料欄 credit_score user_id
credit_score
ssn

載入範例

從本機檔案或 Cloud Storage 載入

範例:

load --source_format=CSV samples.customers \
  ./customers_data.csv \
  ./customers_schema.json
來源欄 更新資料欄
是否已勾選精細讀取者政策標記? 不適用
已勾選的資料欄 不適用 user_id
credit_score
ssn

串流

使用舊版 insertAll 串流 API 或 Storage Write API 串流時,系統不會檢查政策標記。對於 BigQuery 變更資料擷取,系統會檢查主鍵欄的政策標記。

複製範例

將資料附加至現有資料表

範例:

cp -a samples.customers samples.customers_dest
來源欄 更新資料欄
是否已勾選精細讀取者政策標記?
已勾選的資料欄 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;"
來源欄 更新資料欄
是否已勾選精細讀取者政策標記?
已勾選的資料欄 customers.user_id
customers.credit_score
customers.ssn
customers_dest.user_id
customers_dest.credit_score
customers_dest.ssn