לא אחת מתבצעים על ה Database שינויים אשר בדיעבד נרצה לבטלם, לדוגמא – נעשה Update שגוי על טבלה יחד עם Commit או נמחקה בטעות טבלה באמצעות פקודת ה Drop.
בעבר יכולת ה Backup & Recovery של אורקל היתה הדרך המרכזית בהתמודדות מול מצבים אלו. החל מגרסה 9i אורקל פיתחה יכולת מדהימה בפשטותה הנקראת Flashback, יכולת זו מסתמכת על טכנולוגיית ה UNDO אשר תפסה תאוצה בגרסה זו (Automatic Undo Management).
באמצעות יכולות ה Flashback ניתן לבטל שינויים רבים שנעשו בצורה קלה, נוחה וללא התערבות ה DBA.
ככל שגרסאות אורקל התקדמו כך התפתחו סוגים שונים של Flashback. בלינק הבא ניתן לראות את הרשימה המלאה. בפוסט זה נתמקד ב Flashback Query – אשר באמצעותו ניתן לצפות בשורות שונות כפי שהיו בנקודה מסויימת בעבר.
נריץ שאילתה המציגה את שכר העובדים :
14:21:21 HR >SELECT last_name, salary
14:21:28 2 FROM hr.employees ;
LAST_NAME SALARY
------------------------- ----------
Colmenares 2503
Weiss 8005
Fripp 8205
Kaufling 7905
...
באמצעות השאילתה הבאה נוכל לראות את שכרם הממוצע :
14:21:28 HR >SELECT AVG(salary) FROM hr.employees;
AVG(SALARY)
-----------
6241.38318
נבצע עדכון על שכרם יחד עם Commit
14:22:02 HR >UPDATE hr.employees
14:22:04 2 SET salary=8000;
107 rows updated.
14:22:04 HR >commit;
Commit complete.
כעת אם נבדוק שוב נראה כי שכר כל העובדים שונה ל 8000, בנקודה זו Rollback כבר לא יעזור …
14:22:04 HR >SELECT last_name, salary
14:22:04 2 FROM hr.employees;
LAST_NAME SALARY
------------------------- ----------
Colmenares 8000
Weiss 8000
Fripp 8000
Kaufling 8000
...
14:22:04 HR >SELECT AVG(salary) FROM hr.employees;
AVG(SALARY)
-----------
8000
בנקודה זו נוכל להשתמש ב Flashback Query כדי לצפות בשורות כפי שהיו 10 דקות קודם לכן :
14:22:04 HR >SELECT last_name, salary
14:22:46 2 FROM hr.employees AS OF TIMESTAMP sysdate - 10/24/60 ;
LAST_NAME SALARY
------------------------- ----------
Colmenares 2503
Weiss 8005
Fripp 8205
Kaufling 7905
...
נוכל גם להשתמש ב Flashback Query כדי לצפות בשורות כפי שהיו בשעה 14:00 בדיוק :
14:33:33 HR >SELECT last_name, salary
14:33:37 2 FROM hr.employees AS OF TIMESTAMP
TO_DATE('14/12/2012 14:00:00' , 'DD/MM/YYYY HH24:MI:SS')
LAST_NAME SALARY
------------------------- ----------
Colmenares 2503
Weiss 8005
Fripp 8205
Kaufling 7905
...
כדי להחזיר את המצב לקדמותו נוכל להשתמש בפקודת ה Update הבאה לדוגמא :
14:22:51 HR >UPDATE hr.employees OUT
14:23:21 2 SET salary = (SELECT salary
14:23:21 3 FROM hr.employees AS OF TIMESTAMP sysdate - 10/24/60
14:23:21 4 WHERE employee_id = OUT.employee_id);
107 rows updated.
14:23:21 HR >COMMIT ;
Commit complete.
14:23:27 HR >SELECT last_name, salary
14:23:34 2 FROM hr.employees
14:23:34 3 WHERE rownum < 10;
LAST_NAME SALARY
------------------------- ----------
Colmenares 2503
Weiss 8005
Fripp 8205
...
14:23:34 HR >SELECT AVG(salary) FROM hr.employees;
AVG(SALARY)
-----------
6241.38318