2008-12-11 8 views
3

J'ai appris récemment qu'Oracle possède une fonctionnalité qui m'a été très utile - le concepteur/l'implémenteur ne se souciant guère de l'historique des données - je peux interroger l'état historique d'un enregistrer si elle est encore disponible dans le cache de l'oracle, comme ceci:Historique des enregistrements Oracle utilisant l'horodatage dans un intervalle

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?

Répondre

8

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ée par le paramètre UNDO_RETENTION et sera généralement quelques heures plutôt qu'en jours.

0
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 ceci. Consultez le documentation (vous souhaiterez peut-être trouver les documents pour votre version).

2

Une remarque à prendre en compte est que ce type de requête de retour en arrière repose sur les informations UNDO écrites dans l'espace table UNDO. Et cette information n'est pas conservée pour toujours - la plupart des systèmes de production sous une charge raisonnable ne disposeront pas de 24 heures d'informations UNDO disponibles. Selon la version d'Oracle, vous devrez peut-être définir le paramètre UNDO_RETENTION sur une valeur plus longue que la période de temps à laquelle vous essayez de revenir en arrière.

Questions connexes