3 Stimmen

Oracle Datensatzhistorie mit Hilfe der Zeitmarke innerhalb eines Bereichs anzeigen

Ich habe kürzlich gelernt, dass Oracle eine Funktion hat, die ziemlich nützlich für mich war - da der Designer/Implementierer nicht viel Wert auf die Datenhistorie gelegt hat - kann ich den historischen Zustand eines Datensatzes abfragen, wenn er noch im Oracle-Cache verfügbar ist, so wie hier:

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

Aber jetzt muss ich die historischen Daten innerhalb eines Bereichs überprüfen. Ist es irgendwie möglich, den Cache zu verwenden?

8voto

Tony Andrews Punkte 125904

Ja, so:

SQL> select sal from emp where empno=7369;

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

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

1 Reihe aktualisiert.

SQL> commit;

Commit abgeschlossen.

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

1 Reihe aktualisiert.      

SQL> commit;

Commit abgeschlossen.

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

Beachten Sie, dass die Rückverfolgung durch den UNDO_RETENTION-Parameter begrenzt ist und in der Regel Stunden und nicht Tage beträgt.

2voto

Justin Cave Punkte 220606

Eine Anmerkung, auf die zu achten ist, ist, dass diese Art von Flashback-Abfrage auf UNDO-Informationen angewiesen ist, die in den UNDO-Tablespace geschrieben werden. Und diese Informationen werden nicht für immer aufbewahrt - die meisten Produktionssysteme unter angemessener Last werden nicht 24 Stunden UNDO-Informationen zur Verfügung haben.

Je nach Oracle-Version müssen Sie möglicherweise den UNDO_RETENTION-Parameter auf einen Wert setzen, der länger ist als der Zeitraum, den Sie durch Blitzrücknahme versuchen.

0voto

Dave Costa Punkte 45801
SELECT *
  FROM sometable
  VERSIONS BETWEEN TIMESTAMP systimestamp - 1 AND systimestamp

Gibt Ihnen alle Versionen aller Zeilen des letzten Tages.

Es gibt noch viel mehr, was Sie damit tun können. Schauen Sie sich die Dokumentation an (eventuell müssen Sie die Dokumente für Ihre Version finden).

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X