إنتقال للمحتوى

  • تسجيل الدخول عبر الفيس بوك تسجيل الدخول عبر تويتر Log In with LinkedIn Log In with Google      تسجيل دخول    
  • إنشاء حساب

صورة
- - - - -

عمل Audit Tables بشكل آلي من خلال Function


3 رد (ردود) على هذا الموضوع

#1 ORA-2008

ORA-2008

    مشترك

  • الأعضــاء
  • 192 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:FLY 4 EVER
    http://www.i3lani.co.cc

تاريخ المشاركة 15 February 2010 - 12:02 PM

مرحبا
DECLARE
OUT VARCHAR2(10000);
OUTT VARCHAR2(10000);
CURSOR C1 IS
SELECT A.TABLE_NAME FROM USER_TABLES A WHERE TABLE_NAME not like '%_ADT';
CURSOR C2(TAB_NAME VARCHAR2) IS
SELECT A.TABLE_NAME, A.COLUMN_NAME, A.DATA_TYPE, A.DATA_LENGTH
FROM DBA_TAB_COLUMNS A
WHERE A.TABLE_NAME = TAB_NAME ;
BEGIN DBMS_OUTPUT.PUT_LINE('--------------------- Start ------------------');
FOR I IN C1 LOOP
OUT :='CREATE TABLE ' || I.TABLE_NAME || '_ADT(' || CHR(10)||
'/* -------------[AUTO GENRATED SCRIPT]-------------' || CHR(10)||
' --------[USER: '||USER||' DATE: '||TO_CHAR(SYSDATE,'DD/MM/YYYY')||']-------- */'|| CHR(10);
OUTT :='CREATE OR REPLACE TRIGGER '|| I.TABLE_NAME|| '_TRGR' || CHR(10) ||
'AFTER INSERT OR UPDATE OR DELETE ' || CHR(10)||
'ON '||I.TABLE_NAME||CHR(10)||
'FOR EACH ROW ' || CHR(10)||
'BEGIN ' || CHR(10)||
'/* -------------[AUTO GENRATED SCRIPT]-------------' || CHR(10)||
' --------[USER: '||USER||' DATE: '||TO_CHAR(SYSDATE,'DD/MM/YYYY')||']-------- */'|| CHR(10)||
' INSERT INTO '||I.TABLE_NAME || '_ADT VALUSE('|| CHR(10);
FOR J IN C2(I.TABLE_NAME) LOOP
IF J.DATA_TYPE != 'DATE' THEN
OUT := OUT ||' '|| J.COLUMN_NAME || '_New ' || J.DATA_TYPE || ' (' ||
J.DATA_LENGTH || '),' || CHR(10);
OUTT:=OUTT||' :NEW.'||J.COLUMN_NAME||',';
OUT := OUT ||' '|| J.COLUMN_NAME || '_Old ' || J.DATA_TYPE || ' (' ||
J.DATA_LENGTH || '),' || CHR(10);
OUTT:=OUTT||':OLD.'||J.COLUMN_NAME||','||CHR(10);
ELSE
OUT := OUT ||' '|| J.COLUMN_NAME || '_New ' || J.DATA_TYPE || ' ,' || CHR(10);
OUTT:=OUTT||' :NEW.'||J.COLUMN_NAME||',';
OUT := OUT ||' '|| J.COLUMN_NAME || '_Old ' || J.DATA_TYPE || ' ,' || CHR(10);
OUTT:=OUTT||':OLD.'||J.COLUMN_NAME||','||CHR(10);
END IF;
END LOOP;
OUT := OUT || ' USERNM VARCHAR2(33),'||CHR(10)||
' CHNGDATE DATE' || CHR(10) || ')' || CHR(10);
OUTT := OUTT||' USER,'||CHR(10)||
' SYSDATE);' || CHR(10);
OUTT:=OUTT||'END';

begin EXECUTE IMMEDIATE(OUT);
--DBMS_OUTPUT.PUT_LINE(OUT);
DBMS_OUTPUT.PUT_LINE('--------------------- Create Audit Table ['||i.TABLE_NAME||'_ADT] ------------------');
exception when others then
null;
end;
begin EXECUTE IMMEDIATE(OUTT);
--DBMS_OUTPUT.PUT_LINE(OUTT);
DBMS_OUTPUT.PUT_LINE('--------------------- Create Trigger ['||i.TABLE_NAME||'_TRGR] ------------------');
exception when others then
null;
end;
END LOOP;
DBMS_OUTPUT.PUT_LINE('--------------------- End ------------------');
END;

صورة

#2 mohammedciko

mohammedciko

    عضو

  • الأعضــاء
  • 15 مشاركة

تاريخ المشاركة 15 February 2010 - 03:07 PM

ممتاز بس مكدبش عليك محتاج بعض التوضيح لو ممكن تتعب شوي كمان وتشرحة لذيادة الفهم اللة يبارك فيك :blink:

#3 mostfa_future

mostfa_future

    عضو مميز

  • الأعضــاء
  • 570 مشاركة
  • البـلـد: Country Flag

تاريخ المشاركة 15 February 2010 - 03:58 PM

بسم الله ما شاء الله

لا تحسبن المجد تمرا أنت اكله *** لن تبلغ المجد حتى تلعق الصبر


صورةصورة


#4 ORA-2008

ORA-2008

    مشترك

  • الأعضــاء
  • 192 مشاركة
  • البـلـد: Country Flag
  • الاهتمامات:FLY 4 EVER
    http://www.i3lani.co.cc

تاريخ المشاركة 16 February 2010 - 12:05 PM

مرحبا
**هذا تعديل للسكريبت**
DECLARE
OUT VARCHAR2(10000);
OUTT VARCHAR2(10000);
CURSOR C1 IS
SELECT A.TABLE_NAME FROM USER_TABLES A WHERE TABLE_NAME not like '%_ADT';
CURSOR C2(TAB_NAME VARCHAR2) IS
SELECT A.TABLE_NAME, A.COLUMN_NAME, A.DATA_TYPE, A.DATA_LENGTH
FROM DBA_TAB_COLUMNS A
WHERE A.TABLE_NAME = TAB_NAME /*'ACC_TYPES'*/
;
BEGIN DBMS_OUTPUT.PUT_LINE('--------------------- Start ------------------');
FOR I IN C1 LOOP
OUT :='CREATE TABLE ' || I.TABLE_NAME || '_ADT(' || CHR(10)||
'/* -------------[AUTO GENRATED SCRIPT]-------------' || CHR(10)||
' --------[USER: '||USER||' DATE: '||TO_CHAR(SYSDATE,'DD/MM/YYYY')||']-------- */'|| CHR(10);
OUTT :='CREATE OR REPLACE TRIGGER '|| I.TABLE_NAME|| '_TRGR' || CHR(10) ||
'AFTER INSERT OR UPDATE OR DELETE ' || CHR(10)||
'ON '||I.TABLE_NAME||CHR(10)||
'FOR EACH ROW ' || CHR(10)||
'BEGIN ' || CHR(10)||
'/* -------------[AUTO GENRATED SCRIPT]-------------' || CHR(10)||
' --------[USER: '||USER||' DATE: '||TO_CHAR(SYSDATE,'DD/MM/YYYY')||']-------- */'|| CHR(10)||
' INSERT INTO '||I.TABLE_NAME || '_ADT VALUES('|| CHR(10);
FOR J IN C2(I.TABLE_NAME) LOOP
IF J.DATA_TYPE != 'DATE' THEN
OUT := OUT ||' '|| J.COLUMN_NAME || '_New ' || J.DATA_TYPE || ' (' ||
J.DATA_LENGTH || '),' || CHR(10);
OUTT:=OUTT||' :NEW.'||J.COLUMN_NAME||',';
OUT := OUT ||' '|| J.COLUMN_NAME || '_Old ' || J.DATA_TYPE || ' (' ||
J.DATA_LENGTH || '),' || CHR(10);
OUTT:=OUTT||':OLD.'||J.COLUMN_NAME||','||CHR(10);
ELSE
OUT := OUT ||' '|| J.COLUMN_NAME || '_New ' || J.DATA_TYPE || ' ,' || CHR(10);
OUTT:=OUTT||' :NEW.'||J.COLUMN_NAME||',';
OUT := OUT ||' '|| J.COLUMN_NAME || '_Old ' || J.DATA_TYPE || ' ,' || CHR(10);
OUTT:=OUTT||':OLD.'||J.COLUMN_NAME||','||CHR(10);
END IF;
END LOOP;
OUT := OUT || ' USERNM VARCHAR2(33),'||CHR(10)||
' CHNGDATE DATE' || CHR(10) || ');' || CHR(10);
OUTT := OUTT||' USER,'||CHR(10)||
' SYSDATE);' || CHR(10);
OUTT:=OUTT||'END;';

begin EXECUTE IMMEDIATE(OUT);
--DBMS_OUTPUT.PUT_LINE(OUT);
DBMS_OUTPUT.PUT_LINE('--------------------- Create Audit Table ['||i.TABLE_NAME||'_ADT] ------------------');
exception when others then
null;
end;
begin EXECUTE IMMEDIATE(OUTT);
--DBMS_OUTPUT.PUT_LINE(OUTT);
DBMS_OUTPUT.PUT_LINE('--------------------- Create Trigger ['||i.TABLE_NAME||'_TRGR] ------------------');
exception when others then
null;
end;
END LOOP;
DBMS_OUTPUT.PUT_LINE('--------------------- End ------------------');
END;

صورة