Oracle histoire d'enregistrement à l'aide d'horodatage comme dans une plage
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?
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.