2016-05-27 6 views
0

Ich versuche einen Trigger auszulösen, der owner_notif_sta nach einer Aktualisierung oder Einfügung in owner_notif_sta auf null setzt, wenn owner_id null ist. Sowohl owner_id als auch owner_notif_sta stammen aus derselben Tabelle.Derby ERROR 54038: Maximale Tiefe verschachtelter Trigger wurde überschritten

Der Auslöser:

CREATE TRIGGER check_owner 
AFTER UPDATE OF owner_notif_sta ON risk 
REFERENCING OLD AS EXISTING 
FOR EACH ROW MODE DB2SQL 
    UPDATE risk SET owner_notif_sta = NULL 
    WHERE owner_id IS NULL; 

Das Update ich Feuer geläutert:

UPDATE RISK SET owner_notif_sta = 'helloo' WHERE risk_id = 'ICT123'; 

und OWNER_ID null war (nicht aufgefüllt, wenn ich das Update gefeuert)

und ich erhielt die folgende Fehler: Fehler 54038: Maximale Tiefe der verschachtelten Trigger wurde überschritten.

Vielen Dank im Voraus

Antwort

1

Was die UPDATE Aussage leicht wechselnden Reihen auszuschließen, die bereits owner_notif_sta als null haben:

CREATE TRIGGER check_owner 
AFTER UPDATE OF owner_notif_sta ON risk 
REFERENCING OLD AS EXISTING 
FOR EACH ROW MODE DB2SQL 
    UPDATE risk 
     SET owner_notif_sta = NULL 
    WHERE owner_id IS NULL 
     AND owner_notif_sta IS NOT NULL; 
+0

Ihnen danken. Ich habe das versucht, aber ich denke, dass Derby keine If else-Anweisungen unterstützt. –

+0

Ich habe meine Antwort bearbeitet. Ich denke, es ist viel einfacher und es sollte funktionieren. Fügen Sie am Ende der 'UPDATE'-Anweisung im Trigger einfach' AND owner_notif_sta IS NOT NULL' hinzu. Es sollte die rekursiven Trigger-Aufrufe verhindern. – sstan

+1

Ich sollte hinzufügen, da dies ein Zeilentrigger ist, bin ich überrascht, dass Ihre Update-Anweisung keine 'Where'-Klausel für eine Schlüssel- oder ID-Spalte hat (z. B .:' where id = existing.id) '. Ich würde erwarten, dass das Update auf eine einzige Zeile beschränkt ist, aber das sehe ich nicht. Das ist vielleicht etwas anderes, was du sehen musst. – sstan