fbpx

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