변경 내역 작업

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 변경 내역에 행을 추가합니다.

구문

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가 삭제가 아닌 테이블 추가만 캡처하므로 바나나에 대한 정보가 있는 행은 계속 존재합니다.

제한사항

변경 내역에는 다음과 같은 제한사항이 적용됩니다.

  • 업데이트 또는 삭제가 아닌 추가에 대한 정보만 볼 수 있습니다.
  • 데이터는 테이블의 시간 이동 기간으로 제한됩니다.