FLASHBACK QUERY
Le operazioni Flashback Query utilizzano gli Undo data per poter visualizzare modifiche fatte ad una tabella (delete, update, insert) in un istante di tempo.
Esso restituisce solo dati che hanno subito una commit, pertanto i valori vecchi vengono mantenuti per un tempo determinato da parametro undo retention.
Viene utilizzato per
- recuperare dati committati per errore
- confrontare valori attuali con quelli passati
- correggere errori utente
Inoltre è una operazione che può usare un qualsiasi user con i privilegi di flashback e select.
E s e m p i o
Esso restituisce solo dati che hanno subito una commit, pertanto i valori vecchi vengono mantenuti per un tempo determinato da parametro undo retention.
Viene utilizzato per
- recuperare dati committati per errore
- confrontare valori attuali con quelli passati
- correggere errori utente
Inoltre è una operazione che può usare un qualsiasi user con i privilegi di flashback e select.
E s e m p i o
Sessione#1
select DEPARTMENT_NAME from EMP_1 where DEPARTMENT_ID = 100;
update EMP_1 set DEPARTMENT_NAME ='Sales' where DEPARTMENT_ID = 100;
select DEPARTMENT_NAME from EMP_1 where DEPARTMENT_ID = 100;
Sessione#2
select DEPARTMENT_NAME from EMP_1 where DEPARTMENT_ID = 100;
Se la Sessione#1 esegue il commit la Sessione#2 visualizzerà il valore "Sales".
Sessione#1
Commit;
Sessione#2
select DEPARTMENT_NAME from EMP_1 where DEPARTMENT_ID = 100;
Se eseguiamo la seguente Flashback Quey di 3 minuti fa otteniamo come risultato "Finance" perché i dati sono ancora nell'Undo.
SELECT department_name
FROM emp_1
AS OF TIMESTAMP SYSDATE - (3/1440)
where DEPARTMENT_ID = 100;
Oppure, avendo eseguito la commit in data 08/07/2016 12:39 usare la funzione TO_TIMESTAMP.
SELECT department_name
FROM emp_1
AS OF TIMESTAMP TO_TIMESTAMP('2016-07-08 12:39:00', 'YYYY-MM-DD HH:MI:SS')
where DEPARTMENT_ID = 100;
A questo punto è possibile recuperare il vecchio valore con un update
update emp_1 set department_name = (
SELECT department_name
FROM emp_1
AS OF TIMESTAMP TO_TIMESTAMP('2016-07-08 12:39:00', 'YYYY-MM-DD HH:MI:SS')
where DEPARTMENT_ID = 100
);
Oppure eseguire una insert se era stata effettuata una delete.