Question

J'ai récemment appris que l'oracle a une caractéristique qui était assez utile pour moi - en tant que concepteur / implementator ne se souciait pas beaucoup sur l'histoire de données - je peux interroger l'état historique d'un dossier si elle est encore disponible dans le cache oracle, comme ceci:

select * 
  from ( select * 
           from sometable where some_condition ) 
as of timestamp sysdate-1 

Mais maintenant je dois vérifier les données historiques dans une plage. Est-il possible de toute façon, en utilisant le cache?

Était-ce utile?

La solution

Oui, comme ceci:

SQL> select sal from emp where empno=7369;

       SAL
----------
      5800

SQL> update emp set sal = sal+100 where empno=7369;

1 row updated.

SQL> commit;

Commit complete.

SQL> update emp set sal = sal-100 where empno=7369;

1 row updated.      

SQL> commit;

Commit complete.

SQL> select empno, sal, versions_starttime,versions_xid
  2  from emp
  3  versions between timestamp sysdate-1 and sysdate
  4  where empno=7369;

     EMPNO        SAL VERSIONS_STARTTIME                                                          VERSIONS_XID
---------- ---------- --------------------------------------------------------------------------- --
      7369       5900 11-DEC-08 16.05.32                                                          0014001300002A74
      7369       5800 11-DEC-08 16.03.32                                                          000D002200012EB1
      7369       5800

Notez que Jusqu'où vous pouvez aller est limité par le paramètre UNDO_RETENTION, et sera généralement quelques heures plutôt qu'en jours.

Autres conseils

Une note à prendre en compte est que ce genre de requête flashback repose sur des informations UNDO qui est écrit dans le tablespace UNDO. Et cette information ne sont pas conservées forever-- la plupart des systèmes de production sous charge raisonnable ne vont pas avoir 24 heures d'information UNDO disponibles.

En fonction de la version d'Oracle, vous devrez peut-être régler le paramètre à une valeur UNDO_RETENTION plus longue que la période de temps que vous essayez de flash-back à travers.

SELECT *
  FROM sometable
  VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp

vous donnera toutes les versions de toutes les lignes du dernier jour.

Il y a beaucoup plus que vous pouvez faire avec cela. Consultez le (vous pouvez pour trouver la documentation pour votre version).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top