السلام عليكم
Tracking Changes in Data
قد تكتشف فى بعض الأحيان وجود تحديثات غير لائقه فى البيانات داخل الجداول وتريد ان تعرف متى تم اضافه هذه البيانات داخل الجداول ففى هذه الحاله يمكنك استخدام multiple flashback queries لأستعراض البيانات عند نقطه معينه فمن خلال هذه الأداه سوف تتمكن من استعراض كافه التغييرات على البيانات خلال فترات زمنيه مختلفه.
ملحوظه : يمكنك عمل ذلك فى حاله كان اصدار قاعده البيانات لديك اقل من او يساوى oracle database 10g.1
ولكن ما بعد ذلك فهى تعمل خلال فتره زمنيه لا تتجازو الـ 900 ثانيه
ملحوظه : يمكنك عمل ذلك فى حاله كان اصدار قاعده البيانات لديك اقل من او يساوى oracle database 10g.1
ولكن ما بعد ذلك فهى تعمل خلال فتره زمنيه لا تتجازو الـ 900 ثانيه
وتمكنك هذه الاداه من الحاق VERSIONS clause الى جمله SELECT لكى تتمكن من تحديد فتره زمنيه معينه بأستخدام SCN or timestamp لكى تتمكن من رؤيه التعديلات التى تمت على البيانات
ما هو (SCN) ؟
هو System Change Number
تقوم اوركال بأدخال ارقام معينه الى الصفوف فى قاعده البيانات بعد كل عمليه حفظ لكى تتمكن بعد ذلك من الرجوع الى نقطه معينه
فى المثال التالى سوف اقوم بعمل update على جدول employees سوف اقوم بتعدل راتبه من كذا الى كذا ثم سوف استعرض راتبه قبل التحديث وبعد التحديث ثم سوف استخدام VERSIONS clause لـ استعراض راتبه قبل التحديث وبعده.
Code
SELECT SALARY FROM EMPLOYEES WHERE employee_id = 107; SALARY -------- 4200 UPDATE EMPLOYEES SET SALARY = SALARY * 1.30 WHERE EMPLOYEE_ID = 107; COMMIT; 1 rows updated. commited. SELECT SALARY FROM EMPLOYEES WHERE employee_id = 107; SALARY -------- 5460
سوف استخدم الأن جمله VERSIONS clause فمن خلالها سوف اعرض لك حاله الراتب قبل وبعد التعديل
SELECT salary FROM employees VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE WHERE employee_id = 107; SALARY -------- 5460 4200
يمكنك الكود التالى من استعراض كافه التغييرات التى حدث بناء على شرط معين او بدون شرط حسب احتياجك
SELECT versions_starttime "START_DATE", versions_endtime "END_DATE", salary FROM employees VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE WHERE last_name = 'Lorentz'; START_DATE END_DATE SALARY ---------------------- ---------------------- -------- 21-فبراير-2013 15:44:5 7098 0 21-فبراير-2013 15:44:5 5460 0
مثال بـ استخدام timestamp
ALTER SESSION SET NLS_TIMESTAMP_FORMAT = 'DD-MON-YYYY HH24:MI:SS'; SELECT versions_startscn, versions_starttime, versions_endscn, versions_endtime, VERSIONS_XID, VERSIONS_OPERATION, LAST_NAME, SALARY FROM employees VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2013-02-21 15:44:50', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2013-02-21 15:45:00', 'YYYY-MM-DD HH24:MI:SS') WHERE LAST_NAME = 'Lorentz';
مثال اخر :
SELECT LAST_NAME, SALARY FROM EMPLOYEES VERSIONS BETWEEN TIMESTAMP SYSTIMESTAMP - INTERVAL '30' MINUTE AND SYSTIMESTAMP - INTERVAL '1' MINUTE WHERE last_name ='Lorentz';
ملحوظه مهمه فى الغالب سوف يظهر لك الخطأ التالى فى حاله تجاوزك لـ undo_retetention
والـ undo_ retention هى الفتره الزمنيه المسموح بها لعمل flashback وهى تقدر بحوالى 900 ثانيه
والـ undo_ retention هى الفتره الزمنيه المسموح بها لعمل flashback وهى تقدر بحوالى 900 ثانيه
30052. 00000 - "invalid lower limit snapshot expression"
*Cause: The lower limit snapshot expression was below the UNDO_RETENTION
limit.
*Action: Specify a valid lower limit snapshot expression.
show parameter retention; NAME TYPE VALUE -------------------------------------------------- ----------- --------- db_flashback_retention_target integer 1440 undo_retention integer 900
ولكى تتخطى هذه المشكله يجب عليك عمل التالى
ALTER USER "HR" QUOTA UNLIMITED ON UNDOTBS1;
ولكن لا يمكنك عمل ذلك بعد oracle database 10g r1
هذا على حد علمى حتى الأن لو وصلت ان شاء الله لطريقه جديده تمكنك من توسيع الفتره الزمنيه فـ سوف اقوم بعمل تحديث للموضوع
الله يفتح عليك
ReplyDelete