audyt 50 kolumn za pomocą wyzwalacza Oracle

Muszę utworzyćtrigger woracle 11g do kontroli tabeli.

Mam stół z50 columns to musi byćaudited.

Dlaevery new insert do stołu, muszę wprowadzić wpisaudit table (1 row).Dlaevery update załóżmy, że aktualizuję1st 2nd column , następnie utworzy dwa rekordy w audycie z jegoold value and new value .

struktura tabeli audytu będzie

 id        NOT NULL
 attribute NOT NULL
 OLD VALUE NOT NULL
 NEW VALUE NOT NULL
 cre_date  NOT NULL
 upd_date  NULL
 cre_time  NOT NULL
 upd_time  NULL

W przypadkuinsert , tylko klucz podstawowy (tabela główna), tjid icre_date and cre_time muszą być zaludnione iattribute równy* , w przypadku aktualizacji, przypuśćmy, że colA i colB się aktualizują, wtedy wszystko musi być wypełnione. W tym przypadku zostaną utworzone dwa rekordy z atrybutem pierwszego rekorducolA i odpowiadająceold and new wartość, i to samo dlacolB

Teraz moim rozwiązaniem jest kontrolanot very optimized , stworzyłemrow level trigger , która sprawdzi każdą 50 kolumn dla tej tabeli, czy byłachanged lub nie na podstawie jegonew and old value(if -else) i zapełni tabelę kontroli. Nie jestem zadowolony z mojego rozwiązania, dlatego publikuję tutaj. Inne rozwiązanie, które widziałem w poniższym linku:

http://stackoverflow.com/questions/1421645/oracle-excluding-updates-of-one-column-for-firing-a-trigger

To nie działa w moim przypadku, zrobiłem POC dla tego, jak pokazano poniżej:

create table temp12(id number);

create or replace trigger my_trigger
after update or insert on temp12
for each row
declare
  TYPE tab_col_nt IS table of varchar2(30);

  v_tab_col_nt tab_col_nt;

begin
 v_tab_col_nt := tab_col_nt('id','name');

   for r in v_tab_col_nt.first..v_tab_col_nt.last
   loop
      if updating(r) then
         insert into data_table values(1,'i am updating'||r);
      else
      insert into data_table values(2,'i am inserting'||r);
      end if;
   end loop;

 end;

W przypadku aktualizacji nazywa inną część, nie wiem dlaczego. Czy to możliwe dziękicompound trigger

questionAnswers(5)

yourAnswerToTheQuestion