Databases Reference
In-Depth Information
Zeile zugegriffen werden. Nur bei einem BEFORE-Trigger kön-
nen so auch die neuen Werte noch verändert werden.
Die WHEN-Zeile erlaubt die Angabe einer Bedingung, die zu-
sätzlich zum auslösenden Ereignis geprüft werden soll. Dabei
ist die Zeile nur bei Triggern mit
FOR EACH ROW
erlaubt und
bezieht sich auf die aktuell behandelte Zeile. Die veränderten
Werte können auch in der WHEN-Bedingung referenziert wer-
den, dabei werden hier allerdings irritierend
NEW
und
OLD
statt
:NEW
und
:OLD
genutzt. Beim vorgestellten Trigger könnte
man z. B. verhindern, dass neue Hasen auch in die Protokollta-
belle eingetragen werden. Dazu wird nach
FOR EACH ROW
die
Zeile
WHEN (NEW.Gattung<>'Hase')
ergänzt. Man beachte die syntaktisch notwendigen Klammern.
Die WHEN-Bedingung macht die Ausführung etwas kürzer, da
schnell festgestellt werden kann, ob der Trigger ausgeführt
werden muss. Prinzipiell kann man die Prüfung der Bedingung
auch in den PL/SQL-Teil der Aktion des Triggers einbauen.
Der Bedeutung der Zeile
FOR EACH ROW
soll jetzt mit einem
kleinen Beispiel verdeutlicht werden. Dazu wird zunächst fol-
gende Spieltabelle angelegt.
CREATE TABLE Tr(
X NUMBER,
Y NUMBER
);
INSERT INTO Tr VALUES (1,3);
INSERT INTO Tr VALUES (1,4);
INSERT INTO Tr VALUES (1,5);
SELECT * FROM Tr;
Die Ausgabe lautet wie folgt.
Trigger einmal
pro Zeile oder
pro Aktion
X Y
---------------------- ----------------------
1 3
1 4
1 5
Dann wird ein Trigger angelegt, der sich nur auf die gesamte
Tabelle und nicht die einzelnen Zeilen bezieht.
CREATE OR REPLACE TRIGGER TrOhneEach
BEFORE UPDATE
ON Tr
BEGIN
DBMS_OUTPUT.PUT_LINE('TrOhneEach');
272