4 Stimmen

Was bedeuten Referenzen auf OLD in der WHEN-Ursache eines Oracle Insert-Triggers?

Ich weiß, dass Sie beim Schreiben eines Triggers auf Zeilenebene in Oracle die Funktion OLD y NEW Pseudo-Datensätze, um auf den alten und neuen Zustand der Zeile zu verweisen, die den Auslöser ausgelöst hat.
Ich weiß, dass in einem INSERT Auslöser OLD keine Daten enthält, aber ich bin mir nicht sicher, wie sich dies auf die Auswertung einer WHEN Klausel für diesen Auslöser. Zum Beispiel, wenn ich den folgenden Auslöser habe:

CREATE OR REPLACE TRIGGER mung_row
BEFORE INSERT OR UPDATE ON some_table
FOR EACH ROW
BEGIN
    :NEW.foo = 'some val';
END;

und ich diesen Trigger so ändern möchte, dass er nur bei einer Aktualisierung ausgeführt wird, wenn foo zuvor null war, aber immer bei einer Einfügung ausgeführt wird, könnte ich den Aktualisierungsteil der Änderung erfüllen, indem ich eine WHERE Klausel:

CREATE OR REPLACE TRIGGER mung_row
BEFORE INSERT OR UPDATE ON some_table
FOR EACH ROW
WHEN (OLD.foo IS NULL)
BEGIN
    :NEW.foo = 'some val';
END;

Wird dies im Fall des Einfügens Probleme verursachen? Was wird OLD.foo in der Datei INSERT ?

Ich bin mir bewusst, dass ich die INSERT y UPDATE Auslöser oder Verwendung INSERTING / UPDATING / DELETING im Auslösergehäuse, aber in dem Fall, der diese Frage ausgelöst hat, würde ich das lieber nicht tun.

10voto

Adam Paynter Punkte 45274

Wenn ein Datensatz eingefügt wird, wird jedes Feld von OLD wird sein NULL einschließlich der Felder, die als NOT NULL in der Definition der Tabelle.

Nehmen wir zum Beispiel an, Ihre Tabelle hat eine nicht-nullbare Spalte namens id :

CREATE TABLE some_table (
    id NUMBER NOT NULL,
    foo VARCHAR2(100)
)

Wenn ein Datensatz in diese Tabelle eingefügt wird, OLD.id wird sein NULL . Wenn jedoch ein Datensatz in dieser Tabelle aktualisiert wird, OLD.id wird nicht NULL . Weil Sie nur ändern wollen :NEW.foo wenn ein Datensatz aktualisiert wird, müssen Sie nur prüfen, ob OLD.id einen Wert hat, der nicht Null ist.

CREATE OR REPLACE TRIGGER mung_row
BEFORE INSERT OR UPDATE ON some_table
FOR EACH ROW
WHEN (OLD.id IS NOT NULL AND OLD.foo IS NULL)
BEGIN
    :NEW.foo = 'some val';
END;

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X