audyt 50 kolumn za pomocą wyzwalacza Oracle
Muszę utworzyćtrigger
woracle 11g
do kontroli tabeli.
Mam stół z50 columns
to musi byćaudited
.
every 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