11. Mai 2009

Mehr zu Flashback Query (Abfragen in die Vergangenheit)

English title: More about Flashback Query (Queries into the past)

Mit dem Thema Flashback Query hatte ich ja bereits im vorletzten Blog-Posting begonnen. Dort könnt Ihr lesen, wie Ihr mit der AS OF-Klausel eine Abfrage zu einem Zeitpunkt in der Vergangenheit ausführen könnt.
The last but one posting contained some information about the Flashback Query feature which allows to execute a SQL query "in the past".
Heute stelle ich einige weiterführende Konzepte vor. Zunächst die Flashback Versions Query, auf die in einem der Kommentare zu Recht schon verwiesen wurde:
Today I'll continue on this topic - there are some additional features available beyond the "pure" flashback query. First there is the Flasback Versions Query which was pointed out by one of the commantators. So I'll pick this up:
     EMPNO ENAME      V VERSIONS_XID     VERSIONS_STARTTIME
---------- ---------- - ---------------- ---------------------
      7369 SMITH      D 14001D007C170000 07.05.09 10:09:53
      7369 SMITH      I 0C0004001B180000 07.05.09 11:14:18
      7369 SMITH
      7499 ALLEN      D 14001D007C170000 07.05.09 10:09:53
      7499 ALLEN      I 0C0004001B180000 07.05.09 11:14:18
      7499 ALLEN
      7521 WARD       D 14001D007C170000 07.05.09 10:09:53
      7521 WARD       I 0C0004001B180000 07.05.09 11:14:18
      7521 WARD
      7566 JONES      D 14001D007C170000 07.05.09 10:09:53
         : :          : :                :
Man kann also nicht nur die Daten zum Zeitpunkt X, sondern auch die Operationen, welche die Daten seitdem verändert haben, ansehen. Die Klausel VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE besagt, dass alle in den Undo-Segmenten vorhandenen Versionen selektiert werden sollen. Wieviel das tatsächlich ist, hängt von der Größe des Undo-Tablespace und von der Transaktionslast auf dem System ab. Die Spalte VERSIONS_OPERATION gibt wieder, ob die Daten eingefügt ("I"), geändert ("U") oder gelöscht ("D") wurden. Spalten wie VERSIONS_XID, VERSIONS_SCN und VERSIONS_STARTTIME enthalten Details zur jeweiligen Datenbanktransaktion. Damit müsste es ja eigentlich möglich sein, das Undo-SQL zu konstruieren ... und auch das ist kein Problem; die View FLASHBACK_TRANSACTION_QUERY enthält genau diese Information.
The Flashback Versions Query shows not only the data as it was in the past but also information about all transactions which modified the data from the past until the current version. The VERSIONS BETWEEN TIMESTAMP MINVALUE and MAXVALUE clause leads the database to show all undo information which is available. The actual amount of information depends (as explained in the previous but one posting) on the undo tablespace size and the trancation load on the system. The VERSIONS_OPERATION column contains a flag indicating the kinf of XML which modified the row: "I" is for SQL INSERT, "U" for UPDATE and "D" was a DELETE operation. The other columns (VERSIONS_SCN, VERSIONS_STARTTIME etc) contain detailed information about the transaction. With this information it's basically possible to construct some kind of UNDO SQL - and this is also available: The FLASHBACK_TRANSACTION_QUERY view contains the desired information.

COMMIT_SCN OPERATION                        ROW_ID
---------- -------------------------------- -------------------
UNDO_SQL
------------------------------------------------------------------------------------------------------------------------------------------------------
      4711 INSERT                           AAApb3AAEAAANxgAAA
delete from "PARTNER"."EMP" where ROWID = 'AAApb3AAEAAANxgAAA';

      4711 INSERT                           AAApb3AAEAAANxgAAB
delete from "PARTNER"."EMP" where ROWID = 'AAApb3AAEAAANxgAAB';

      4711 INSERT                           AAApb3AAEAAANxgAAC
delete from "PARTNER"."EMP" where ROWID = 'AAApb3AAEAAANxgAAC';

      4711 INSERT                           AAApb3AAEAAANxgAAD
delete from "PARTNER"."EMP" where ROWID = 'AAApb3AAEAAANxgAAD';

      4711 DELETE                           AAApb3AAEAAANxgAAb
insert into "PARTNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7934','MILLER','CLERK','7782',TO_DATE('23.01.82', 'DD.MM.RR'),'1301',NULL,'10');

      4711 DELETE                           AAApb3AAEAAANxgAAa
insert into "PARTNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7902','FORD','ANALYST','7566',TO_DATE('03.12.81', 'DD.MM.RR'),'3000',NULL,'20');

      4711 DELETE                           AAApb3AAEAAANxgAAZ
insert into "PARTNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7900','JAMES','CLERK','7698',TO_DATE('03.12.81', 'DD.MM.RR'),'951',NULL,'30');

      4711 DELETE                           AAApb3AAEAAANxgAAY
insert into "PARTNER"."EMP"("EMPNO","ENAME","JOB","MGR","HIREDATE","SAL","COMM","DEPTNO") values ('7876','ADAMS','CLERK','7788',TO_DATE('12.01.83', 'DD.MM.RR'),'1101',NULL,'20');
Nun ist das Abfragen der Daten in der Vergangenheit mit der AS OF-Klausel sehr bequem, aber es kommt doch recht häufig vor, dass man ein SQL-Kommando vielleicht gar nicht ändern kann oder nicht möchte. Auch hierfür gibt es eine Lösung: Das Paket DBMS_FLASHBACK. Nach Aufruf der Prozedur ENABLE_AT_TIME zielen alle SQL-Abfragen auf den gesetzten Zeitpunkt; man spart sich also die AS OF-Klausel.
Flashback Query usage with the AS OF clause is very convenient, but there are situations in which a query cannot be modified. For those cases there is the PL/SQL package DBMS_FLASHBACK. The procedure ENABLE_AT_TIME enables Flashback Query for all subsequent SQL queries. The AS OF clause is not necessary then.
Passend dazu gibt es natürlich auch die Prozedur DISABLE. Viel Spaß beim Ausprobieren.
Disabling Flashback Query is (of course) also possible: With the procedure DISABLE. Have fun!

Keine Kommentare:

Beliebte Postings