Oracle: Triggerauslösung mehrfach oder einfach

sceppi

Mitglied
Hallo,
ich habe eine prizipielle Frage zu Triggern in Oracle Datenbanken(10g).
Es handelt sich um Trigger, die auf alle 3 Aktionen (insert, delete, update) reagieren.
Nun ist die Frage, ob dieser Trigger mehrmals ausgelöst wird und dann auch einzeln abläuft, oder ob das ganze nur einmal passiert, wenn z.B. bei einen Delete mehrere Datensätze gelöscht werden?
Vielen Dank für die Hilfe
 
Oracle kennt 3, ab 11g sogar 4 Arten von Triggern:

DDL Trigger: Feuern bei bestimmten DDL Aktionen bzw. Systemevents, z.B. wenn sich ein Benutzer an der Datenbank anmeldet.

DML Trigger auf Statement Ebene: Wir nur einmal pro Statement ausgelöst, unabhängig davon wieviel Zeilen von dem Statement betroffen sind.

DML Trigger auf Zeilenebene: Wird für jede relevante Zeile aufgeführt. Ausschlaggebend ist die Klausel "FOR EACH ROW" im CREATE TRIGGER Statement.

Compund Trigger: (Ab 11g) Feuert vor jedem Statement, vor jeder Zeile, nach jeder Zeile und am Ende jedes Statements. Dies funktioniert, indem innerhalb eines Triggers 4 Prozeduren angelegt werden.

Am häufigsten verwendet werden wohl "BEFORE od. AFTER ... FOR EACH ROW", also ein Trigger, der vor oder nach jeder Änderung an einer Zeile hängt. Man muss allerdings ein bisschen aufpassen, dass man in Triggern (besonders in BEFORE Triggern) nur transaktionsorientierte Aufgaben erledigt, da Oracle nicht garantiert, dass ein Trigger nur einmal pro Zeile ausgelöst wird. Das Phänomen nennt man "Restarts". Der Oracle Guru Tom Kyte hat dazu eine sehr ausführliche Diskussion
http://asktom.oracle.com/pls/asktom/f?p=100:11:0::::P11_QUESTION_ID:11504247549852

Für dein Beispiel mit den Deletes kommt es also drauf an ob der Trigger mit "FOR EACH ROW" angelegt wurde, dann feuert er für jede gelöschte Zeile, oder ohne "FOR EACH ROW", dann feuert er genau einmal entweder VOR (BEFORE) oder nach (AFTER) der Ausführung des Statements.
 
Hallo Exceptionfault,
danke für die gute Zusammenfassung.
Ich denke, ich werde DML Trigger auf Zeilenebene verwenden. Dass passt mir eher.
Viele Grüße
sceppi
 
Zurück