列レベルのアクセス制御からの書き込みへの影響
このページでは、BigQuery の列レベルのアクセス制御を使用して、列レベルでデータへのアクセスを制限する場合の書き込みへの影響について説明します。列レベルのアクセス制御に関する一般的な情報については、BigQuery の列レベルのアクセス制御の概要をご覧ください。
列レベルのアクセス制御を使用すると、ユーザーはポリシータグで保護されている列に対して読み取り権限が必要になります。一部の書き込みオペレーションでは、実際に列に書き込む前に列データを読み取る必要があります。このようなオペレーションでは、BigQuery はユーザーの読み取り権限をチェックして、ユーザーがその列へのアクセス権を持っていることを確認します。たとえば、保護されている列への書き込みを含むデータの更新をユーザーが行う場合、ユーザーには保護されている列の読み取り権限が必要です。保護されている列への書き込みを含む新しいデータ行の挿入を行う場合は、保護されている列の読み取りアクセス権は必要ありません。ただし、そのような行を書き込むユーザーは、保護されている列に対する読み取り権限がない限り、新しく書き込まれたデータを読み取ることはできません。
以降のセクションでは、さまざまなタイプの書き込みオペレーションについて詳しく説明します。このトピックの例では、次のスキーマを持つ customers
テーブルを使用します。
フィールド名 | 型 | モード | ポリシータグ |
---|---|---|---|
user_id |
STRING | REQUIRED | policy-tag-1 |
credit_score |
INTEGER | NULLABLE | policy-tag-2 |
ssn |
STRING | NULLABLE | policy-tag-3 |
BigQuery データ操作言語(DML)の使用
データの挿入
INSERT
ステートメントの場合、スキャンする列または更新する列のポリシータグに対するきめ細かい読み取り権限が BigQuery によって確認されることはありません。これは、INSERT
が列データを読み取る必要がないためです。ただし、読み取り権限のない列に値を挿入しても、挿入された値は設定どおりに保護されます。
データの削除、更新、結合
DELETE
、UPDATE
、MERGE
ステートメントの場合、BigQuery はスキャンする列に対するきめ細かい読み取り権限を確認します。WHERE
句、またはデータの読み取りにクエリを必要とする他の句やサブクエリを含めない限り、これらのステートメントで列はスキャンされません。
データの読み込み
Cloud Storage やローカル ファイルなどからテーブルにデータを読み込むとき、BigQuery は宛先テーブルの列のきめ細かい読み取り権限を確認しません。これは、データの読み込みでは宛先テーブルからのコンテンツの読み取りは不要なためです。
BigQuery へのストリーミングは、LOAD
と INSERT
に似ています。BigQuery を使用すると、きめ細かい読み取り権限がなくても、宛先テーブルにデータをストリーミングできます。
データのコピー
コピー オペレーションを行う場合、BigQuery はユーザーがソーステーブルに対してきめ細かい読み取り権限を持っているかどうかを確認します。BigQuery は、宛先テーブル内の列に対するきめ細かい読み取り権限を持つかどうかは確認しません。LOAD
、INSERT
、ストリーミングと同様に、宛先テーブル内の列に対するきめ細かい読み取り権限がない限り、コピーが完了すると、書き込まれたデータを読み取ることができなくなります。
DML の例
INSERT
例:
INSERT INTO customers VALUES('alice', 85, '123-456-7890');
ソース列 | 列の更新 | |
---|---|---|
ポリシータグのきめ細かい読み取り権限の確認 | N/A | なし |
チェックの対象となる列 | N/A | 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
ソース列 | 列の更新 | |
---|---|---|
ポリシータグのきめ細かい読み取り権限の確認 | N/A | なし |
チェックの対象となる列 | N/A | 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 |