Update Trigger

SonnyHH

Benutzer
Beiträge
22
Hallo @all

Folgendes Szenario: In Tabelle A gibt es ein Feld ID, A1 und A2 und weitere. Es gibt eine weitere Tabelle B mit der selben Struktur, wie Tabelle A.

Ist es mit einem Trigger möglich, dass der komplette Datensatz aus Tabelle A in Tabelle B geschrieben/kopiert wird, wenn eines der Felder A1 oder A2 (oder beide) per Update geändert wird, und zwar vor dem Update des Datensatzes, also im Ursprungszustand?

Wenn ja, wie setzt man so was um?

Danke im Voraus für Hinweise.

Viele Grüße
André
 
Werbung:
Ja, das geht:
Code:
CREATE OR REPLACE TRIGGER MEINTRIGGER
AFTER UPDATE ON A
FOR EACH ROW
BEGIN
   IF :OLD.SPALTE1 <> :NEW.SPALTE1 OR :OLD.SPALTE2 <> :NEW.SPALTE2 THEN
     INSERT INTO B(SPALTE1,SPALTE2) VALUES(:OLD.SPALTE1,:OLD.SPALTE2);
   END IF;
END;
 
Vielen Dank für die schnelle Antwort. Ich habe Deinen Vorschlag enstsprechend angepasst und kompiliert. Dabei kommt folgende Meldung:

Binds eingeben: New, Old

Die Meldung bestätige ich einfach mit Anwenden und der Trigger wird fehlerfrei erstellt. Allerdings löst er nach einem Update und Commit auf der Tabelle nicht aus. Woran kann das liegen?

Code:
CREATE OR REPLACE TRIGGER TRG_SCHAD_UPDATE
AFTER UPDATE ON SCHAD
FOR EACH ROW
BEGIN
    IF :OLD.HAVARIEID <> :NEW.HAVARIEID /* OR :OLD.SPALTE2 <> :NEW.SPALTE2 */ THEN
        INSERT INTO SCHAD_SICHERUNG(S_UQID, HAVARIEID, SHIPID) VALUES(:OLD.S_UQID, :OLD.HAVARIEID, :OLD.SHIPID);
    END IF;
END;

Habe ich irgendwo einen Fehler eingebaut?
 
Die Meldung bestätige ich einfach mit Anwenden und der Trigger wird fehlerfrei erstellt. Allerdings löst er nach einem Update und Commit auf der Tabelle nicht aus. Woran kann das liegen?
Hmm welches Programm verwendest Du? Führ das als Sript aus, beim SQL Developer und Toad ist es z.B. F5.
Ist der Trigger auch wirklich angelegt d.h. Du kannst ihn sehen?

Nur zur Sicherheit mal nachgefragt: Du verwendest nicht den user sys oder?
 
Ja, das geht:
Code:
CREATE OR REPLACE TRIGGER MEINTRIGGER
AFTER UPDATE ON A
FOR EACH ROW
BEGIN
   IF :OLD.SPALTE1 <> :NEW.SPALTE1 OR :OLD.SPALTE2 <> :NEW.SPALTE2 THEN
     INSERT INTO B(SPALTE1,SPALTE2) VALUES(:OLD.SPALTE1,:OLD.SPALTE2);
   END IF;
END;

Kann ORA auch conditional Trigger? Also das die Filterung bereits beim create trigger ... when (old.col != new.col ) ... erfolgt und nicht erst in der Trigger-Funktion?
 
Kann ORA auch conditional Trigger? Also das die Filterung bereits beim create trigger ... when (old.col != new.col ) ... erfolgt und nicht erst in der Trigger-Funktion?
Ja richtig, ist besser:
Code:
CREATE OR REPLACE TRIGGER TRG_SCHAD_UPDATE
AFTER UPDATE ON SCHAD
FOR EACH ROW
WHEN (NEW.HAVARIEID <> OLD.HAVARIEID)
BEGIN
    INSERT INTO SCHAD_SICHERUNG(S_UQID, HAVARIEID, SHIPID) VALUES(:OLD.S_UQID, :OLD.HAVARIEID, :OLD.SHIPID);
END;

Achtung: Keine : vor dem new/old in der WHEN Clause.
 
Werbung:
Vielen Dank für die Unterstützung! Das Problem lag bei mir. Ich habe den Wert in NULL geändert und das wurde nicht erfasst. Bei einem Zahelnwert löst der Trigger korrekt aus.
 
Zurück
Oben