카테고리:

쿼리 구문

CHANGES

CHANGES 절을 사용하는 경우, 명시적 트랜잭션 오프셋이 있는 스트림을 만들지 않고도, 지정된 시간 간격 내에서 테이블 또는 뷰에 대한 변경 내용 추적 메타데이터를 쿼리할 수 있습니다. 다중 쿼리는 서로 다른 트랜잭션 시작과 엔드포인트 사이에서 변경 내용 추적 메타데이터를 검색할 수 있습니다.

참고

변경 내용 추적은 소스 테이블 또는 소스 뷰와 그 기본 테이블에서 활성화되어야 합니다. 자세한 내용은 이 항목에 있는 사용법 노트를 참조하십시오.

쿼리에서 CHANGES 절은 FROM 절에 지정됩니다.

선택적 END 키워드는 변경 간격의 종료 타임스탬프를 지정합니다.

구문

SELECT ...
FROM ...
   CHANGES ( INFORMATION => { DEFAULT | APPEND_ONLY } )
   AT ( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> | STREAM => '<name>' } ) | BEFORE ( STATEMENT => <id> )
   [ END( { TIMESTAMP => <timestamp> | OFFSET => <time_difference> | STATEMENT => <id> } ) ]
[ ... ]
Copy
INFORMATION => { DEFAULT | APPEND_ONLY }

각각에 기록된 메타데이터를 기반으로 반환할 변경 내용 추적 데이터의 형식을 지정합니다.

DEFAULT

삽입, 업데이트, 삭제(테이블 자르기 포함)를 포함하여 소스 오브젝트에 대한 모든 DML 변경 내용을 반환합니다. 이러한 유형의 변경 추적은 변경 세트에서 삽입 및 삭제된 행을 비교하여 행 수준 델타를 제공합니다. 예를 들어, 결과적으로, 테이블의 두 트랜잭션 시점 사이에서 삽입된 다음 삭제된 행은 델타에서 제거됩니다(즉, 쿼리 결과에 반환되지 않음).

APPEND_ONLY

추가된 행만 반환합니다. 따라서 조인이 수행되지 않습니다. 결과적으로, Append-only 변경 내용을 쿼리하는 것은 행 삽입에만 의존하는 ELT(추출, 로딩, 변환) 및 유사한 시나리오의 표준(기본) 변경 내용을 쿼리하는 것보다 훨씬 더 성능이 좋을 수 있습니다.

TIMESTAMP => timestamp

Time Travel에 사용할 정확한 날짜와 시간을 지정합니다. 값은 명시적으로 TIMESTAMP에 캐스팅되어야 합니다.

OFFSET => time_difference

Time Travel에 사용할 현재 시간과의 초 단위 차이를 -N 형식으로 지정합니다. 여기서 N 은 정수 또는 산술 식일 수 있습니다(예: -120 은 120초, -30*60 은 1800초 또는 30분).

STATEMENT => id

Time Travel의 기준점으로 사용할 문의 쿼리 ID를 지정합니다. 이 매개 변수는 다음 형식 중 하나의 문을 지원합니다.

  • DML(예: INSERT, UPDATE, DELETE)

  • TCL(BEGIN, COMMIT 트랜잭션)

  • SELECT

STREAM => 'name'

쿼리된 테이블 또는 뷰의 기존 스트림에 대한 식별자(즉, 이름)를 지정합니다. 스트림의 현재 오프셋은 원본 오브젝트에 대한 변경 데이터를 반환하기 위한 AT 시점으로 사용됩니다.

사용법 노트

  • 디렉터리 테이블 또는 외부 테이블 에 대한 변경 내용(변경 내용 추적 메타데이터를 사용하여 확인됨)을 쿼리할 때는 CHANGES 절이 지원되지 않습니다.

  • 현재, 테이블에 대한 변경 내용 추적 메타데이터가 기록되려면 다음 중 하나 이상 충족되어야 합니다.

    • 테이블에 대한 변경 내용 추적이 활성화됩니다(ALTER TABLE … CHANGE_TRACKING = TRUE 사용).

    • 테이블에 대한 스트림이 생성됩니다(CREATE STREAM 사용).

    두 옵션 모두 변경 내용 추적 메타데이터를 저장하는 숨겨진 열을 테이블에 추가합니다. 열은 소량의 저장소를 사용합니다.

    뷰의 변경 데이터를 쿼리하려면 소스 뷰 및 그 기본 테이블에서 변경 추적을 활성화해야 합니다. 자세한 지침은 뷰와 기본 테이블에서 변경 내용 추적 활성화하기 섹션을 참조하십시오.

  • AT | BEFORE 절은 필수이며 변경 내용 추적 메타데이터에 대한 현재 오프셋을 설정합니다.

  • 선택적 END 절은 변경 간격의 종료 타임스탬프를 설정합니다. END 값을 지정하지 않은 경우, 현재 타임스탬프가 변경 간격의 종료로 사용됩니다.

    END 절은 변경 내용 추적 메타데이터를 쿼리하기 위해 CHANGES 절과 결합된 경우에만 유효합니다(즉, 다른 오브젝트에 대한 과거 데이터를 쿼리하기 위해 Time Travel을 사용할 때 이 절을 AT|BEFORE와 결합할 수 없음)

  • TIMESTAMP 또는 OFFSET의 값은 상수 식이어야 합니다.

  • TIMESTAMP의 최소 시간 해상도는 밀리초입니다.

  • 요청된 데이터가 Time Travel 보존 기간(기본값은 1일)을 초과하는 경우, 문이 실패합니다.

    또한, 요청된 데이터가 Time Travel 보존 기간 내에 있지만, 사용 가능한 과거 데이터가 없는 경우(예: 보존 기간이 연장된 경우), 문이 실패합니다.

다음 예에서는 테이블에 대한 표준(델타) 및 Append-only 변경 내용 추적 메타데이터를 쿼리합니다. END() 값이 제공되지 않으므로 현재 타임스탬프가 트랜잭션 시간 간격의 엔드포인트로 사용됩니다.

 CREATE OR REPLACE TABLE t1 (
   id number(8) NOT NULL,
   c1 varchar(255) default NULL
 );

-- Enable change tracking on the table.
 ALTER TABLE t1 SET CHANGE_TRACKING = TRUE;

 -- Initialize a session variable for the current timestamp.
 SET ts1 = (SELECT CURRENT_TIMESTAMP());

 INSERT INTO t1 (id,c1)
 VALUES
 (1,'red'),
 (2,'blue'),
 (3,'green');

 DELETE FROM t1 WHERE id = 1;

 UPDATE t1 SET c1 = 'purple' WHERE id = 2;

 -- Query the change tracking metadata in the table during the interval from $ts1 to the current time.
 -- Return the full delta of the changes.
 SELECT *
 FROM t1
   CHANGES(INFORMATION => DEFAULT)
   AT(TIMESTAMP => $ts1);

 +----+--------+-----------------+-------------------+------------------------------------------+
 | ID | C1     | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID                          |
 |----+--------+-----------------+-------------------+------------------------------------------|
 |  2 | purple | INSERT          | False             | 1614e92e93f86af6348f15af01a85c4229b42907 |
 |  3 | green  | INSERT          | False             | 86df000054a4d1dc64d5d74a44c3131c4c046a1f |
 +----+--------+-----------------+-------------------+------------------------------------------+

 -- Query the change tracking metadata in the table during the interval from $ts1 to the current time.
 -- Return the append-only changes.
 SELECT *
 FROM t1
   CHANGES(INFORMATION => APPEND_ONLY)
   AT(TIMESTAMP => $ts1);

 +----+-------+-----------------+-------------------+------------------------------------------+
 | ID | C1    | METADATA$ACTION | METADATA$ISUPDATE | METADATA$ROW_ID                          |
 |----+-------+-----------------+-------------------+------------------------------------------|
 |  1 | red   | INSERT          | False             | 6a964a652fa82974f3f20b4f49685de54eeb4093 |
 |  2 | blue  | INSERT          | False             | 1614e92e93f86af6348f15af01a85c4229b42907 |
 |  3 | green | INSERT          | False             | 86df000054a4d1dc64d5d74a44c3131c4c046a1f |
 +----+-------+-----------------+-------------------+------------------------------------------+
Copy

다음 예는 테이블에서 행이 삭제되기 전의 트랜잭션 시점부터 테이블에 대한 Append-only 변경 내용을 사용합니다.

CREATE OR REPLACE TABLE t1 (
  id number(8) NOT NULL,
  c1 varchar(255) default NULL
);

-- Enable change tracking on the table.
ALTER TABLE t1 SET CHANGE_TRACKING = TRUE;

-- Initialize a session 'start timestamp' variable for the current timestamp.
SET ts1 = (SELECT CURRENT_TIMESTAMP());

INSERT INTO t1 (id,c1)
VALUES
(1,'red'),
(2,'blue'),
(3,'green');

-- Initialize a session 'end timestamp' variable for the current timestamp.
SET ts2 = (SELECT CURRENT_TIMESTAMP());

DELETE FROM t1;

-- Create a table populated by the change data between the start and end timestamps.
CREATE OR REPLACE TABLE t2 (
  c1 varchar(255) default NULL
  )
AS SELECT C1
  FROM t1
  CHANGES(INFORMATION => APPEND_ONLY)
  AT(TIMESTAMP => $ts1)
  END(TIMESTAMP => $ts2);

SELECT * FROM t2;

+-------+
| C1    |
|-------|
| red   |
| blue  |
| green |
+-------+
Copy

다음 예는 이전 예와 유사합니다. 이 예에서는 원본 테이블의 변경 데이터로 새 테이블을 채우기 위한 시작 시점으로 원본 테이블의 스트림에 대한 현재 오프셋을 사용합니다. 스트림이 원본 오브젝트에서 생성되므로 오브젝트에서 변경 내용 추적을 명시적으로 사용할 필요가 없습니다.

CREATE OR REPLACE TABLE t1 (
  id number(8) NOT NULL,
  c1 varchar(255) default NULL
);

-- Create a stream on the table.
CREATE OR REPLACE STREAM s1 ON TABLE t1;

INSERT INTO t1 (id,c1)
VALUES
(1,'red'),
(2,'blue'),
(3,'green');

-- Initialize a session 'end timestamp' variable for the current timestamp.
SET ts2 = (SELECT CURRENT_TIMESTAMP());

DELETE FROM t1;

-- Create a table populated by the change data between the current
-- s1 offset and the end timestamp.
CREATE OR REPLACE TABLE t2 (
  c1 varchar(255) default NULL
  )
AS SELECT C1
  FROM t1
  CHANGES(INFORMATION => APPEND_ONLY)
  AT(STREAM => 's1')
  END(TIMESTAMP => $ts2);

SELECT * FROM t2;

+-------+
| C1    |
|-------|
| red   |
| blue  |
| green |
+-------+
Copy