기록 데이터 쿼리
명령줄 또는 웹 콘솔 내의 쿼리 편집기를 사용하여 쿼리를 실행할 수 있습니다.
예제 쿼리에는 다음 표 정의가 사용됩니다.
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=’1002’ FOR 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=’1004’ FOR SYSTEM_TIME BEFORE ‘2022-11-01 12:45:07’;
이 예에서는 제품이 잘못 삭제되어 복원해야 하는 경우입니다.