Protokolldaten abfragen

Sie können die Abfragen über die Befehlszeile ausführen oder über den Abfrageeditor in der Webkonsole.

Die folgende Tabellendefinition wird für die Beispielabfragen verwendet.

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

Die folgenden Zeilen werden zu unterschiedlichen Zeiten eingefügt. Die Commitzeiten der Einfügungen (die Einfügezeitmarken oder _SYS_START-Werte) werden in SQL-Kommentaren angegeben.

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

Daten mit den Zeitmarken zum Einfügen und Löschen anzeigen

Dieser Befehl SELECT zeigt die Tabellendaten mit den zugehörigen Einfüge-und Löschzeitmarkenwerten zu dem Zeitpunkt an, zu dem die Abfrage abgesetzt wurde. Die Zeitmarken _SYS_START und _SYS_END sind nur in Zeitreiseabfragen verfügbar. Daher wird AS OF NOW () verwendet.

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

Beispiel:

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)

Daten für eine bestimmte Zeit mit AS OF abfragen

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

Beispiel:

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)

In diesem Beispiel wurde der Preis für Shoes nach der angegebenen Zeitmarke AS OF geändert. Das System gibt die vorherige gültige Zeile zurück.

Siehe auch Unterklausel AS OF.

Daten für eine bestimmte Zeit mit BEFORE abfragen

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

Beispiel:

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)

In diesem Beispiel wurde der Preis für Shoes nach oder bei der Zeitmarke BEFORE geändert. Das System gibt die vorherige gültige Zeile zurück.

Siehe auch Unterklausel BEFORE.

Daten für alle Zeilen über einen bestimmten Zeitraum abfragen

Mit dem FROM ...TO, Unterklausel

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

Wenn Sie Protokolldaten so weit wie möglich abfragen möchten, können Sie das Schlüsselwort RETENTION_START_TIMESTAMP in Ihren Zeitreiserückfragen verwenden. Wenn Sie dies tun, können Sie vermeiden, dass Sie die richtige Zeitmarke selbst berechnen müssen. Durch die Erweiterung verringern Sie das Risiko, dass ein Fehler auftritt, wenn der Wert zu alt ist (älter als die Zeitmarke für den Aufbewahrungsbeginn).

Beispiel:

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)

In diesem Beispiel hat die Abfrage nach allen Änderungen gesucht, die für PRODUCTID 1004 in einem angegebenen Zeitraum ohne die Zeitmarke TO vorgenommen wurden.

Siehe auch FROM ...TO Unterklausel.

Mit dem BETWEEN ...Unterklausel AND

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

Beispiel:

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)

In diesem Beispiel hat die Abfrage nach allen Änderungen gesucht, die in einem bestimmten Zeitraum an der Produkttabelle vorgenommen wurden, bis einschließlich der Zeitmarke AND.

Siehe auch BETWEEN ...AND Unterklausel.

Recovery von Tabellen

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;

Beispiel:

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;

In diesem Beispiel vermuten Sie, dass falsche Massenänderungen an der Tabelle PRODUCT vorgenommen wurden, und Sie möchten sie zurücksetzen.

Aktualisierte Zeilen wiederherstellen

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

Beispiel:

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;

In diesem Beispiel wurde der Preis eines Produkts falsch aktualisiert und muss wiederhergestellt werden.

Siehe auch Time Travel Query Syntax und Zeitmarken.

Gelöschte Zeilen wiederherstellen

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

Beispiel:

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

In diesem Beispiel wurde ein Produkt falsch gelöscht und muss wiederhergestellt werden.

Abfragesyntax und Zeitmarken für Zeitreisen.