Hi,
ich habe folgendes Problem:
ich möchte, wenn ich in die Tabelle Test einen Datensatz update einen Wert innerhalb einer Spalte von Test auf True setzen. Also recht trivial. Leider Gottes schaffe ich es nicht. Weder mit Trigger und Funktion noch mit einer Regel.
Mein Versuch mit einer Regel:
Die Fehlermeldung lautet, wenn ich einen Datensatz in Test update, "infinite recursion detected in rules..."Code:CREATE OR REPLACE RULE set_vergeben AS ON UPDATE TO test DO UPDATE test SET vergeben = true WHERE test.vergeben = false AND test.uid::text <> ''::text;
Kann mir bitte jemand einen Anstoß geben?
Vielen Dank.
Grüße
mc
Geändert von mc-bain (01.02.2010 um 16:16 Uhr)
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Danke für den Tip.
Hab nun folgendes ausprobiert:
Leider wird die Funktion nie ausgeführt.Code:CREATE OR REPLACE FUNCTION "set_vergeben"() RETURNS trigger AS $BODY$ BEGIN IF (NEW."uid" IS NOT NULL) THEN NEW."vergeben" = true; END IF; RETURN NEW; END; $BODY$ LANGUAGE 'plpgsql' VOLATILE; CREATE TRIGGER test AFTER UPDATE ON "test" FOR EACH ROW EXECUTE PROCEDURE "set_vergeben"();
Bin noch recht neu in dieser Thematik. Wäre nett, wenn mir noch jemand sagen könnte was ich falsch mache.
Und warum funktioniert das eigentlich nicht mit einer Regel? Genau dafür sind die doch da oder?
Vielen Dank.
Gruß
mc
OK, habs rausgefunden, hatte versehentlich ein AFTER UPDATE drin, musste ein BEFORE UPDATE rein.
Aber warum? Müsste die Funktion nicht ausgelöst werden, nachdem eine Änderung/Update an der Tabelle erfolgt?
Wäre nett, wenn mir auch noch jemand sagen könnte, warum das ganze nicht mit einer Regel klappt.
Aber vielen Dank, mein Problem hat sich gelöst.
Gruß
mc
Du willst ja quasi in den Update-Prozeß eingreifen, bei einem BEFORE-Trigger siehst Du das, was später die Tabelle enthalten wird, unmittelbar vor dem reinspeichern dort. Das ist der ideale Zeitpunkt, da noch was zu verändern.
Eine Regl verwendet man, wenn man das SQL selbst verändern will. Zum Beispiel, wenn Du willst, daß bei einem Update auf einem VIEW stattdessen das Updaten auf die dem VIEW zugrundeliegende Tabelle erfolgt.
Andreas
--
PostgreSQL Hosting
http://www.amazon.de/gp/registry/2APKFICAIYMWBads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
https://www.xing.com/profile/Andreas_Kretschmer7
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen