2/21/2013

Tracking Changes in Data

السلام عليكم
Tracking Changes in Data

قد تكتشف فى بعض الأحيان وجود تحديثات غير لائقه فى البيانات داخل الجداول وتريد ان تعرف متى تم اضافه هذه البيانات داخل الجداول ففى هذه الحاله يمكنك استخدام multiple flashback queries لأستعراض البيانات عند نقطه معينه فمن خلال هذه الأداه سوف تتمكن من استعراض كافه التغييرات على البيانات خلال فترات زمنيه مختلفه.
ملحوظه : يمكنك عمل ذلك فى حاله كان اصدار قاعده البيانات لديك اقل من او يساوى 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 ثانيه

SQL Error: ORA-30052: invalid lower limit snapshot expression
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
هذا على حد علمى حتى الأن لو وصلت ان شاء الله لطريقه جديده تمكنك من توسيع الفتره الزمنيه فـ سوف اقوم بعمل تحديث للموضوع



1 comment: