Ein Commit innerhalb eines Triggers würde die grundlegende Definition einer atomaren Transaktion zunichte machen (siehe ACID). Die Triggerlogik ist per Definition eine Erweiterung der ursprünglichen DML-Operation. Innerhalb von Triggern vorgenommene Änderungen sollten daher im Rahmen der Transaktion, in der sie ausgeführt werden, festgeschrieben oder zurückgesetzt werden. Aus diesem Grund dürfen Trigger KEINE COMMIT- oder ROLLBACK-Anweisungen ausführen (mit Ausnahme autonomer Trigger). Hier ist ein Beispiel dafür, was passieren wird, wenn sie es tun:
SQL> CREATE TABLE tab1 (col1 NUMBER);
Table created.
SQL> CREATE TABLE log (timestamp DATE, operation VARCHAR2(2000));
Table created.
SQL> CREATE TRIGGER tab1_trig
2 AFTER insert ON tab1
3 BEGIN
4 INSERT INTO log VALUES (SYSDATE, 'Insert on TAB1');
5 COMMIT;
6 END;
7 /
Trigger created.
SQL> INSERT INTO tab1 VALUES (1);
INSERT INTO tab1 VALUES (1)
*
ERROR at line 1:
ORA-04092: cannot COMMIT in a trigger
ORA-06512: at "SCOTT.TAB1_TRIG", line 3
ORA-04088: error during execution of trigger 'SCOTT.TAB1_TRIG'
Autonome Transaktionen:
Als Problemumgehung können autonome Transaktionen verwendet werden. Autonome Transaktionen werden getrennt von der aktuellen Transaktion ausgeführt.
Im Gegensatz zu regulären Triggern können autonome Trigger COMMIT- und ROLLBACK-Anweisungen enthalten. Beispiel:
SQL> CREATE OR REPLACE TRIGGER tab1_trig
2 AFTER insert ON tab1
3 DECLARE
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO log VALUES (SYSDATE, 'Insert on TAB1');
7 COMMIT; -- only allowed in autonomous triggers
8 END;
9 /
Trigger created.
SQL> INSERT INTO tab1 VALUES (1);
1 row created.
Beachten Sie, dass im obigen Beispiel Protokolleinträge eingefügt und festgeschrieben werden - auch wenn die Haupttransaktion zurückgesetzt wird!
Denken Sie daran, dass eine Prozedur / Funktion / Auslöser für "autonome_Transaktion" eine ganze Transaktion für sich ist und daher mit einem Commit oder einer Rollback-Anweisung enden muss.