기록 데이터 쿼리

명령줄 또는 웹 콘솔 내의 쿼리 편집기를 사용하여 쿼리를 실행할 수 있습니다.

예제 쿼리에는 다음 표 정의가 사용됩니다.

CREATE TABLE PRODUCT (PRODUCTID INTEGER, DESC VARCHAR (100), PRICE DECIMAL) DATA_VERSION_RETENTION_TIME 30;

다음 행은 서로 다른 시간에 삽입됩니다. 삽입의 커밋 시간(삽입 타임스탬프 또는 _SYS_START 값)은 SQL 주석에 표시됩니다.

INSERT INTO PRODUCT VALUES(1001, 'Jacket', 102.00); -- 2020-10-23 16:00:00
INSERT INTO PRODUCT VALUES(1002, 'Gloves',  20.50); -- 2020-10-23 16:05:00
INSERT INTO PRODUCT VALUES(1003, 'Hat',     18.99); -- 2020-10-23 16:10:00
INSERT INTO PRODUCT VALUES(1004, 'Shoes', 125.25);  -- 2020-10-23 16:15:00

삽입 및 삭제 타임스탬프가 있는 데이터 보기

SELECT 명령은 쿼리가 실행된 시점의 삽입 및 삭제 타임스탬프 값과 관련된 테이블 데이터를 표시합니다. 시스템 시작시스템 종료 타임스탬프는 시간 이동 쿼리에서만 사용할 수 있으므로 AS OF NOW() 를 사용해야 합니다.

SELECT *, _SYS_START, _SYS_END FROM <table_name> FOR SYSTEM_TIME AS OF NOW();

예:

SELECT *, _SYS_START, _SYS_END FROM PRODUCT FOR SYSTEM_TIME AS OF NOW();
PRODUCTID | DESCRIPTION | PRICE   |     _SYS_START      | _SYS_END
----------+-------------+---------+---------------------+-----------
     1001 | Jacket      | 102.00  | 2020-10-23 16:00:00 |
     1002 | Gloves      |  20.50  | 2020-10-23 16:05:00 |
     1003 | Hat         |  18.99  | 2020-10-23 16:10:00 |
     1004 | Shoes       | 125.25  | 2020-10-23 16:15:00 |
(4 rows)

AS OF로 특정 기간의 데이터 쿼리하기

SELECT *, _SYS_START, _SYS_END FROM <table_name> FOR SYSTEM_TIME AS OF <TIMESTAMP EXPRESSION>;

예:

SELECT *, _SYS_START, _SYS_END FROM PRODUCT FOR SYSTEM_TIME AS OF '2020-10-23 16:30:00';
PRODUCTID  | DESCRIPTION | PRICE  |     _SYS_START      |      _SYS_END
-----------+-------------+--------+---------------------+---------------------
      1001 | Jacket      | 102.00 | 2020-10-23 16:00:00 |
      1002 | Gloves      |  20.50 | 2020-10-23 16:05:00 |
      1003 | Hat         |  18.99 | 2020-10-23 16:10:00 |
      1004 | Shoes       | 125.25 | 2020-10-23 16:15:00 | 2020-10-23 17:00:00
(4 rows)

이 예시에서는 ' Shoes '의 가격이 지정된 AS OF 타임스탬프 이후에 수정되었습니다. 시스템은 이전에 유효한 행을 반환합니다.

AS OF 하위 절도 참조하세요.

BEFORE를 사용하여 특정 시간 동안 데이터 쿼리하기

SELECT *, _SYS_START, _SYS_END FROM <table_name> FOR SYSTEM_TIME BEFORE <TIMESTAMP EXPRESSION>;

예:

SELECT *, _SYS_START, _SYS_END FROM PRODUCT FOR SYSTEM_TIME BEFORE '2020-10-23 17:00:00';
PRODUCTID  | DESCRIPTION | PRICE  |     _SYS_START      |      _SYS_END
-----------+-------------+--------+---------------------+---------------------
      1001 | Jacket      | 102.00 | 2020-10-23 16:00:00 |
      1002 | Gloves      |  20.50 | 2020-10-23 16:05:00 |
      1003 | Hat         |  18.99 | 2020-10-23 16:10:00 |
      1004 | Shoes       | 125.25 | 2020-10-23 16:15:00 | 2020-10-23 17:00:00
(4 rows)

이 예시에서는 ' Shoes '의 가격이 타임스탬프 이후 또는 이전에 수정되었습니다. 시스템은 이전에 유효한 행을 반환합니다.

BEFORE 하위 절도 참조하세요.

일정 기간 동안 모든 행에 대한 데이터 쿼리하기

FROM...TO 하위 절 사용

SELECT *, _SYS_START, _SYS_END FROM <table_name> FOR SYSTEM_TIME FROM <TIMESTAMP EXPRESSION 1> TO<TIMESTAMP EXPRESSION 2>WHERE <condition>;

가능한 한 오래 전의 기록 데이터를 쿼리하려면 시간 이동 쿼리에 RETENTION_START_TIMESTAMP 키워드를 사용할 수 있습니다. 이렇게 하면 올바른 타임스탬프를 직접 계산하지 않아도 됩니다. 이렇게 하면 값이 너무 오래된(보존 시작 타임스탬프보다 오래된) 값으로 판명될 경우 오류가 발생할 위험을 줄일 수 있습니다.

예:

SELECT *, _SYS_START, _SYS_END FROM PRODUCT FOR SYSTEM_TIME FROM RETENTION_START_TIMESTAMP TO '2020-10-23 17:10:00' WHERE PRODUCTID = 1004;
PRODUCTID  | DESCRIPTION | PRICE  |     _SYS_START      |      _SYS_END
-----------+-------------+--------+---------------------+---------------------
      1004 | Shoes       | 125.25 | 2020-10-23 16:15:00 | 2020-10-23 17:00:00
      1004 | Shoes       | 100.00 | 2020-10-23 17:00:00 |
(2 rows)

이 예제에서 쿼리는 TO 타임스탬프를 제외하고 지정된 기간 동안 PRODUCTID 1004에 대해 발생한 모든 변경 사항을 검색했습니다.

FROM...TO 하위 절도 참조하세요.

사이...와 하위 절을 사용하여

SELECT *, _SYS_START, _SYS_END FROM <table_name> FOR SYSTEM_TIME BETWEEN <TIMESTAMP EXPRESSION 1> AND <TIMESTAMP EXPRESSION 2>;

예:

SELECT *, _SYS_START, _SYS_END FROM PRODUCT FOR SYSTEM_TIME BETWEEN '2020-10-23 16:00:00' AND '2020-10-23 17:10:00';
PRODUCTID  | DESCRIPTION | PRICE  |     _SYS_START      |      _SYS_END
-----------+-------------+--------+---------------------+---------------------
      1001 | Jacket      | 102.00 | 2020-10-23 16:00:00 |
      1002 | Gloves      |  20.50 | 2020-10-23 16:05:00 |
      1003 | Hat         |  18.99 | 2020-10-23 16:10:00 |
      1004 | Shoes       | 125.25 | 2020-10-23 16:15:00 | 2020-10-23 17:00:00
      1004 | Shoes       | 100.00 | 2020-10-23 17:00:00 |
(5 rows)

이 예제에서는 쿼리가 특정 기간 동안 제품 테이블에 발생한 모든 변경 사항( AND 타임스탬프까지 포함)을 검색했습니다.

비트윈...과 하위 절도 참조하세요.

테이블 복구

BEGIN;
ALTER TABLE <table_name> RENAME TO <new_table_name>;
CREATE TABLE <table_ name> AS
  SELECT * FROM <new_table_name> FOR SYSTEM_TIME <temporal_clause>;
DROP TABLE <new_table_name>; -- or, keep it for diagnostics
COMMIT;

예:

BEGIN;
ALTER TABLE PRODUCT RENAME TO PRODUCT_BAK;
CREATE TABLE PRODUCT AS
  SELECT * FROM FLIGHT_BAK FOR SYSTEM_TIME AS OF '2022-11-01 11:30:00';
DROP TABLE FLIGHT_BAK; -- or, keep it for diagnostics
COMMIT;

이 예에서는 PRODUCT 테이블에 잘못된 대량 변경이 이루어진 것으로 의심되어 이를 되돌리려고 합니다.

업데이트된 행 복원

UPDATE <table> SET <col> = <expression> [, <col> = <expression>...]
  FROM (SELECT <col> [, <col> ...] FROM <fromlist> WHERE <condition> FOR SYSTEM_TIME <temporal_clause>) AS <alias>;

예:

UPDATE PRODUCT SET PRICE=P.PRICE
  FROM (SELECT PRICE FROM PRODUCT WHERE PRODUCTID=1002FOR SYSTEM_TIME BEFORE ‘2022-11-01 09:22:41’) AS P;

이 예에서는 제품 가격이 잘못 업데이트되어 복원해야 했습니다.

시간 여행 쿼리 구문 및 타임스탬프도 참조하세요.

삭제된 행 복원하기

INSERT INTO <table>
  SELECT * FROM <table>
  WHERE <condition> FOR SYSTEM_TIME <temporal_clause>;

예:

INSERT INTO PRODUCT
  SELECT * FROM PRODUCT
  WHERE PRODUCTID=1004FOR SYSTEM_TIME BEFORE ‘2022-11-01 12:45:07’;

이 예에서는 제품이 잘못 삭제되어 복원해야 하는 경우입니다.

시간 여행 쿼리 구문 및 타임스탬프.