Interrogation des données d'historique

Vous pouvez exécuter les requêtes à l'aide de la ligne de commande ou de l'éditeur de requête dans la console Web.

La définition de table suivante est utilisée pour les exemples de requête.

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

Les lignes suivantes sont insérées à des moments différents. Les temps de validation des insertions (horodatages d'insertion ou valeurs _SYS_START ) sont indiqués dans les commentaires 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

Affichage des données avec les horodatages d'insertion et de suppression

Cette commande SELECT affiche les données de table avec les valeurs d'horodatage d'insertion et de suppression associées à l'instant où la requête a été émise. Les horodatages _SYS_START et _SYS_END ne sont disponibles que dans les requêtes de déplacement dans le temps, d'où l'utilisation de AS OF NOW ().

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

Exemple :

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)

Interrogation des données pour une heure spécifique avec le paramètre AS OF

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

Exemple :

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)

Dans cet exemple, le prix de Shoes a été modifié après l'horodatage AS OF spécifié. Le système renvoie la ligne valide précédente.

Voir aussi la sous-clause AS OF.

Interrogation des données pour une heure spécifique avec AVANT

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

Exemple :

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)

Dans cet exemple, le prix de Shoes a été modifié après ou à l'horodatage BEFORE. Le système renvoie la ligne valide précédente.

Voir aussi la sous-clause BEFORE.

Interrogation des données pour toutes les lignes sur une période

Avec le ...Sous-clause TO

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

Si vous souhaitez interroger les données d'historique aussi loin que possible, vous pouvez utiliser le mot clé RETENTION_START_TIMESTAMP dans vos requêtes de voyage dans le temps. Dans ce cas, vous pouvez éviter d'avoir à essayer de calculer vous-même l'horodatage approprié. Par extension, vous réduisez le risque d'erreur si la valeur s'avère trop ancienne (plus ancienne que l'horodatage de début de conservation).

Exemple :

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)

Dans cet exemple, la requête a recherché toutes les modifications apportées à PRODUCTID 1004 au cours d'une période de temps spécifiée, à l'exclusion de l'horodatage TO.

Voir aussi le FROM ...TO sous-clause.

Avec le ENTRE ...Sous-clause AND

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

Exemple :

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)

Dans cet exemple, la requête a recherché toutes les modifications apportées à la table du produit pendant une certaine période de temps, jusqu'à l'horodatage AND inclus.

Voir aussi le ENTRE ...ET sous-clause.

Récupération des tables

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;

Exemple :

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;

Dans cet exemple, vous soupçonnez que des modifications en bloc incorrectes ont été apportées à la table PRODUCT et vous souhaitez les rétablir.

Restauration des lignes mises à jour

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

Exemple :

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;

Dans cet exemple, le prix d'un produit a été mis à jour de manière incorrecte et devait être restauré.

Voir aussi Time travel query syntax and timestamps.

Restauration des lignes supprimées

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

Exemple :

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

Dans cet exemple, un produit a été supprimé de manière incorrecte et a dû être restauré.

Syntaxe de requête de déplacement dans le temps et horodatages.