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.

Zumevery 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

Antworten auf die Frage(5)

Ihre Antwort auf die Frage