Auditing von 50 Spalten mit Orakel-Trigger
Ich muss eine erstellentrigger
imoracle 11g
für die Prüfung eines Tisches.
Ich habe einen Tisch mit50 columns
das muss seinaudited
.
every new insert
In eine Tabelle muss ich einen Eintrag einfügenaudit table (1 row)
.Zumevery update
Angenommen, ich aktualisiere1st 2nd column
, dann wird es mit seinem zwei Datensatz in Audit erstellenold value and new value
.Struktur der Audittabelle wird
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
Im Falle voninsert
, nur der Primärschlüssel (Haupttabelle), did
undcre_date and cre_time
müssen besiedelt sein undattribute
gleich*
Nehmen wir im Falle einer Aktualisierung an, dass colA und colB aktualisiert werden und dann alle Daten ausgefüllt werden müssen. In diesem Fall werden zwei Datensätze mit dem Attribut des ersten Datensatzes erstelltcolA
und entsprechendold and new
Wert, und das gleiche für diecolB
Jetzt ist meine Lösung für das Auditnot very optimized
Ich habe ein erstelltrow level trigger
, die für jede und alle 50 Spalten für diese Tabelle überprüfen, ob es istchanged
oder nicht basierend auf seinernew and old value
(falls -else), und es wird die Audit-Tabelle gefüllt. Ich bin mit meiner Lösung nicht zufrieden, deshalb poste ich hier. Eine andere Lösung, die ich im Link unten gesehen habe:
http://stackoverflow.com/questions/1421645/oracle-excluding-updates-of-one-column-for-firing-a-trigger
Dies funktioniert in meinem Fall nicht, ich habe dafür einen POC durchgeführt, wie unten gezeigt:
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;
Im Falle eines Updates ruft es den else-Teil auf, ich weiß nicht warum. Kann das möglich sein durchcompound trigger