변경 내역 작업
BigQuery 변경 내역을 사용하면 BigQuery 테이블의 변경 내역을 추적할 수 있습니다. 테이블의 변경 내역은 지정된 기간 동안 수행된 특정 변경 유형을 보여주는 SQL 테이블 값 함수(TVF)로 노출됩니다. 이 기능을 사용하면 테이블의 점진적 변경사항을 처리할 수 있습니다. 테이블 변경사항을 이해하면 비용이 많이 드는 복사를 방지하면서 BigQuery 외부에서 테이블 복제본을 점진적으로 유지하는 데 도움이 됩니다.
필수 권한
테이블의 변경 내역을 보려면 해당 테이블에 대한 bigquery.tables.getData
권한이 필요합니다. 다음과 같은 사전 정의된 Identity and Access Management(IAM) 역할에 이 권한이 포함되어 있습니다.
roles/bigquery.dataViewer
roles/bigquery.dataEditor
roles/bigquery.dataOwner
roles/bigquery.admin
테이블에 행 수준 액세스 정책이 있거나 있었던 경우 테이블 관리자만 테이블의 이전 데이터에 액세스할 수 있습니다. bigquery.rowAccessPolicies.overrideTimeTravelRestrictions
권한은 테이블에 필요하며 사전 정의된 roles/bigquery.admin
IAM 역할에 포함되어 있습니다.
테이블에 열 수준 보안이 설정된 경우 액세스할 수 있는 열에 대한 변경 기록만 볼 수 있습니다.
APPENDS
TVF
APPENDS
TVF는 지정된 기간의 테이블에 추가된 모든 행의 테이블을 반환합니다. 다음 작업은 APPENDS
변경 내역에 행을 추가합니다.
CREATE TABLE
DDL 문INSERT
DML 문MERGE
DML 문- BigQuery로 데이터 로드
- 스트리밍 수집
구문
APPENDS( TABLE table, start_timestamp DEFAULT NULL, end_timestamp DEFAULT NULL)
table
: BigQuery 테이블 이름입니다. 뷰, 서브 쿼리, 외부 테이블, 구체화된 뷰 또는 와일드 카드 테이블일 수 없습니다. 이 인수 앞에는TABLE
단어가 와야 합니다.start_timestamp
: 변경사항이 출력에 포함된 가장 이른 시간을 나타내는TIMESTAMP
입니다.NULL
이면 테이블 생성 이후의 모든 변경사항이 반환됩니다.start_timestamp
다음에 테이블이 생성되면 실제 테이블 생성 시간이 사용됩니다. 시간이 시간 이동에서 허용하는 것보다 이전이면 오류가 반환됩니다. 표준 테이블의 경우 이 기간은 7일이지만 이 시간보다 짧은 시간으로 시간 이동 기간을 구성할 수 있습니다.end_timestamp
: 출력에 변경사항이 포함된 가장 최근 시간(배타적)을 나타내는TIMESTAMP
입니다.NULL
인 경우 쿼리가 시작될 때까지 적용된 모든 변경사항이 포함됩니다.
반환 값
APPENDS
TVF는 다음 열이 포함된 테이블을 반환합니다.
- 쿼리 실행 시점에 입력 테이블의 모든 열입니다.
end_timestamp
뒤에 열이 추가되면 열 추가 전에 삽입된 모든 행에NULL
값이 채워진 상태로 표시됩니다. _CHANGE_TYPE
: 행을 생성한 변경 유형을 나타내는STRING
입니다.APPENDS
에 지원되는 유일한 값은INSERT
입니다._CHANGE_TIMESTAMP
: 변경을 수행한 트랜잭션의 커밋 시간을 나타내는TIMESTAMP
입니다.
세부정보
삽입된 행의 레코드는 나중에 해당 데이터가 삭제되더라도 유지됩니다. 삭제는 APPENDS
TVF에 반영되지 않습니다. 테이블이 복사된 경우 복사된 테이블에서 APPENDS
TVF를 호출하면 테이블 생성 시 삽입된 모든 행이 반환됩니다. UPDATE
작업으로 인해 행이 수정된 경우 효과가 없습니다.
Examples
이 예시에서는 Produce
라는 테이블에 다양한 변경사항이 적용되면 APPENDS
에서 반환된 변경 내역을 보여줍니다. 이 예시는 시간 이동 기간보다 긴 기간 동안 완료된 경우 작동하지 않을 수 있습니다.
먼저 테이블을 만듭니다.
CREATE TABLE mydataset.Produce (product STRING, inventory INT64) AS ( SELECT "apples" AS product, 10 AS inventory);
다음으로 테이블에 두 행을 삽입합니다.
INSERT INTO mydataset.Produce VALUES ("bananas", 20), ("carrots", 30);
추가 항목의 전체 변경 내역을 확인합니다. NULL
값을 사용하여 시간 이동 기간 내 전체 기록을 가져옵니다.
SELECT product, inventory, _CHANGE_TYPE AS change_type, _CHANGE_TIMESTAMP AS change_time FROM APPENDS(TABLE mydataset.Produce, NULL, NULL);
출력은 다음과 비슷합니다.
+---------+-----------+-------------+--------------------------------+ | product | inventory | change_type | change_time | +---------+-----------+-------------+--------------------------------+ | apples | 10 | INSERT | 2022-04-15 20:06:00.488000 UTC | | bananas | 20 | INSERT | 2022-04-15 20:06:08.490000 UTC | | carrots | 30 | INSERT | 2022-04-15 20:06:08.490000 UTC | +---------+-----------+-------------+--------------------------------+
그런 다음 열을 추가하고, 값의 새 행을 삽입하고, 인벤토리를 업데이트하고, '바나나' 행을 삭제합니다.
ALTER TABLE mydataset.Produce ADD COLUMN color STRING; INSERT INTO mydataset.Produce VALUES ("grapes", 40, "purple"); UPDATE mydataset.Produce SET inventory = inventory + 5 WHERE TRUE; DELETE mydataset.Produce WHERE product = "bananas";
새 테이블을 확인합니다.
SELECT * FROM mydataset.Produce;
+---------+-----------+--------+ | product | inventory | color | +---------+-----------+--------+ | apples | 15 | NULL | | carrots | 35 | NULL | | grapes | 45 | purple | +---------+-----------+--------+
추가 항목의 전체 변경 내역을 확인합니다.
SELECT product, inventory, color, _CHANGE_TYPE AS change_type, _CHANGE_TIMESTAMP AS change_time FROM APPENDS(TABLE mydataset.Produce, NULL, NULL);
출력은 다음과 비슷합니다.
+---------+-----------+--------+-------------+--------------------------------+ | product | inventory | color | change_type | change_time | +---------+-----------+--------+-------------+--------------------------------+ | apples | 10 | NULL | INSERT | 2022-04-15 20:06:00.488000 UTC | | bananas | 20 | NULL | INSERT | 2022-04-15 20:06:08.490000 UTC | | carrots | 30 | NULL | INSERT | 2022-04-15 20:06:08.490000 UTC | | grapes | 40 | purple | INSERT | 2022-04-15 20:07:45.751000 UTC | +---------+-----------+--------+-------------+--------------------------------+
inventory
열에는 행이 원래 테이블에 삽입될 때 설정된 값이 표시됩니다. UPDATE
문의 변경사항은 표시되지 않습니다. APPENDS
TVF가 삭제가 아닌 테이블 추가만 캡처하므로 바나나에 대한 정보가 있는 행은 계속 존재합니다.
제한사항
변경 내역에는 다음과 같은 제한사항이 적용됩니다.
- 업데이트 또는 삭제가 아닌 추가에 대한 정보만 볼 수 있습니다.
- 데이터는 테이블의 시간 이동 기간으로 제한됩니다.