Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Update Trigger

Dieses Thema im Forum "Oracle" wurde erstellt von SonnyHH, 7 März 2017.

  1. SonnyHH

    SonnyHH Benutzer

    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é
     
  2. drdimitri

    drdimitri Datenbank-Guru

    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;
     
  3. SonnyHH

    SonnyHH Benutzer

    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?
     
  4. drdimitri

    drdimitri Datenbank-Guru

    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?
     
  5. akretschmer

    akretschmer Datenbank-Guru

    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?
     
  6. drdimitri

    drdimitri Datenbank-Guru

    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.
     
    akretschmer gefällt das.
  7. SonnyHH

    SonnyHH Benutzer

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden