לא אחת מתבצעים על ה 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