Wir können COMMIT / ROLLBACK in DML-Triggern nicht ausführen, da die Transaktion nach der DML-Anweisung manuell behandelt wird. Datenbank-Trigger scheinen jedoch eine Ausnahme zu sein. Angenommen, es gibt einen Datenbank-Trigger:
CREATE OR REPLACE TRIGGER user_login_as
AFTER LOGON
ON SCHEMA
BEGIN
INSERT INTO user_login_log(username, log_date, action) VALUES (user, sysdate, 'User has logged in');
END user_login_as;
Der Trigger enthält keine autonome Transaktionsprozedur mit darin enthaltenem Commit. Wer schreibt also die Einfügung fest? Dieser Trigger funktioniert wie ein Zauber und fügt nach der Benutzeranmeldung einen neuen Datensatz in die Protokolltabelle ein. Es riecht nach versteckter Oracle-Funktionalität und ich kann in Oracle-Dokumenten keine Referenz dazu finden. Ich benutze Oracle11g.
Antworten:
Sie erhalten automatisch einen autonomen Transaktionskontext für diese Trigger.
Aus den
CREATE TRIGGER
Dokumenten:Was passiert, wenn der Trigger ausfällt, hängt vom genauen Trigger / Ereignis ab. Siehe Ausnahmebehandlung in Triggern . Insbesondere ein Anmeldetrigger, der mit einer Ausnahme fehlschlägt, kann Nicht-DBA-Benutzer sehr gut sperren. Die Ausnahme führt dazu, dass die Anmeldung fehlschlägt, es sei denn, der Benutzer verfügt über bestimmte Berechtigungen.
quelle
quelle
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:
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:
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.
quelle