[Oracle] Nehmen Trigger an Transaktionen teil?

Thomas Darimont

Erfahrenes Mitglied
Hallo!

Weis jemand ob Trigger auch an Transaktionen teilnehmen?
Beispiel:
Ich starte eine neue Transaktion und fuege innerhalb dieser eine neue Zeile in eine Tabelle ein. Nun lauscht auf der Tabelle ein Trigger der insert/update/delete Aktionen zwecks fuehren einer Historie mitprotokoliert. Dazu schreibt der Trigger bei einer entsprechenden Aktion auf diese Tabelle einen entsprechenden Datensatz in die Historien-Tabelle.
Was passiert dann eigentlich mit dem Eintrag in der Zeile der Historien-Tabelle, wenn ich ein Rollback auf die Transaktion mache?
Ich vermute ja, dass der Trigger der ganz normalen Transaktions-Semantik folgt und bei einem Rollback die Aenderungen an der Historien-Tabelle wieder rueckgaengig macht.
Hab hier leider kein Oracle-System zum testen... kann da vielleicht jemand was zu sagen?

Gruss Tom
 
Die Aktion des Triggers ist Teil der gesamten Transaktion und wird deshalb beim Rollback rückgängig gemacht. Folgt aus der Definition einer Transaktion bzw. deren Eigenschaften (ACID). Anbei der spool mit dem Beweis. :)

Code:
SQL> create table ins_trig(key integer primary key, value varchar2(255));

Table created.

SQL> create table history(key integer primary key, value varchar2(255));

Table created.

SQL>  create trigger t0 after insert on ins_trig 
  2 referencing new as new_row 
  3 for each row 
  4 begin 
  5 insert into history values (:new_row.key, :new_row.value);
  6  end;
  7  /

Trigger created.

SQL> insert into ins_trig values (1, 'test');

1 row created.

SQL> select * from ins_trig;

       KEY                                                                      
----------                                                                      
VALUE                                                                         
--------------------------------------------------------------------------------
         1                                                                      
test                                                                            
                                                                                

SQL> select * from history;

       KEY                                                                      
----------                                                                      
VALUE                                                                           
--------------------------------------------------------------------------------
         1                                                                      
test                                                                            
                                                                                

SQL> rollback;

Rollback complete.

SQL> select * from ins_trig;

no rows selected

SQL> select * from history;

no rows selected

SQL> spool off
 
Hallo!

Okay, und was passiert, wenn ich innerhalb des Triggers explizit ein commit mache und danach in der Anwendung ein Rollback mache?

Gruss Tom
 
Das geht schlicht und ergreifend nicht. Innerhalb eines Triggers darf kein explizites commit oder rollback gemacht werden (mal wieder wegen ACID, genauer gesagt wegen dem A). Ab Oracle 8 kann man das im Prinzip mit Hilfe von sog. "autonomous transactions" umgehen, sollte man aber nicht tun (Bad Thing (TM)).
 
Zuletzt bearbeitet:
Hallo!

Ich weis auch was ACID heiszt... war mir eben nur nicht sicher ob innerhalb eines Triggers ein COMMIT gemacht werden darf oder nicht. Aber jetzt hab ichs auch in der Dokumentation gefunden. (Das schlieszt, dann aber auch ein, dass keine DDL Statements innerhalb von Triggern erlaubt sind, da diese ein implizites COMMIT nach sich ziehen wuerden.)

Gruss Tom
 
Thomas Darimont hat gesagt.:
Hallo!
Ich weis auch was ACID heiszt...

Deswegen hab ich auch keinen Versuch unternommen, es zu erklären. ;-)


(Das schlieszt, dann aber auch ein, dass keine DDL Statements innerhalb von Triggern erlaubt sind, da diese ein implizites COMMIT nach sich ziehen wuerden.)

So isses... Aber auch hier gilt: mit autonomous transactions würde man auch sowas hinbekommen.
 

Neue Beiträge

Zurück