oli001 Geschrieben 10. September 2008 Teilen Geschrieben 10. September 2008 Hi, habe folgendes Problem, vielleicht kann mir da jemand auf die Sprünge helfen: Ich habe folgende TAbelle: id name parentId 1 aaa 0 2 bbb 0 3 ccc 1 10 eee 3 11 ddd 3 12 fff 3 So nun möchte ich einen Trigger, der es ermöglicht, dass wenn eine Zeile gelöscht in alle Zeilen geschaut wird und die parentId durch die parentId der gelöschen Zeile ersetzt wird. Aber nur dann wenn die parentId der Zeile die der id der gelöschten Zeile entspricht. Also nix anderes als Dereferenzieren. Dachte mir das so: CREATE OR REPLACE TRIGGER msystem.remove_sub_menu AFTER DELETE ON msystem.apps REFERENCING NEW AS NEW OLD AS OLD FOR EACH ROW DECLARE tmp DATE; BEGIN UPDATE apps SET id = :OLD.parent_id WHERE id = :OLD.menu_id; EXCEPTION WHEN OTHERS THEN -- Consider logging the error and then re-raise RAISE; END remove_sum_menu; / Klappt aber net, weil der Trigger noch aktiv ist, da kann man dann scheinbar nicht in die Tabelle schreiben. Kann mir da jemand auf die Sprünge helfen? Grüße Oli Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
dr.dimitri Geschrieben 10. September 2008 Teilen Geschrieben 10. September 2008 Hi, Du kannst in einem Rowlevel Trigger weder auf die sich gerade ändernde Tabelle zugreifen noch sie ändern. Ich hab hierzu auch einen kleinen Artikel geschrieben, der die Problematik erklärt: Mutating Table - SQL-Tips.de Kurz gesagt: Das was Du vorhast ist per Trigger nicht zu bewerkstelligen. Was Du hier machst sieht mir eher so aus, als ob Du einen Foreign key Constraint Ersatz per Hand pflegen möchtest. Das wär doppelt falsch. Leg in der übergeordneten Tabelle einen PK Constraint an, dann einen FK Constraint in der untergeordneten Tabelle und zwar mit der Option ON DELETE SET NULL. Ich denke, dass macht das was Du beabsichtigst. Dim Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
flashpixx Geschrieben 10. September 2008 Teilen Geschrieben 10. September 2008 Schuss ins blaue, müsste das nichit "Before Delete" sein? Ein Datensatz wird gelöscht. D.h. er ist noch da, nun hängst Du die Referenzen um, in dem Du aus dem zu löschenden die ID liest und in die Kinder schreibst. Erst wenn das durch ist, löschst Du den Datensatz weg HTH Phil Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.