Trigger und Funktion oder Regel?

Probleme und Fragen zum Thema Trigger und Funktionen.

Trigger und Funktion oder Regel?

Beitragvon mc-bain » Mo 1. Feb 2010, 16:14

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:
Code: Alles auswählen
 
 
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;
 


Die Fehlermeldung lautet, wenn ich einen Datensatz in Test update, "infinite recursion detected in rules..."

Kann mir bitte jemand einen Anstoß geben?
Vielen Dank.
Grüße
mc
mc-bain
Neuer Benutzer
 
Beiträge: 3
Registriert: Mo 1. Feb 2010, 16:06

Beitragvon akretschmer » Mo 1. Feb 2010, 16:23

mc-bain hat geschrieben: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:
Code: Alles auswählen
 
 
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;
 


Die Fehlermeldung lautet, wenn ich einen Datensatz in Test update, "infinite recursion detected in rules..."

Kann mir bitte jemand einen Anstoß geben?
Vielen Dank.
Grüße
mc


Du sucst einen TRIGGER, for each record ..., und before update. Dort hast Du eine Variable NEW.*, in dieser kannst Du dann Deine Spalte setzen.

Die Doku enthält einige Beispiele für TRIGGER, Du schaffst das!

Andreas
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5938
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany

Beitragvon mc-bain » Di 2. Feb 2010, 11:28

Danke für den Tip.

Hab nun folgendes ausprobiert:

Code: Alles auswählen
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"();

 


Leider wird die Funktion nie ausgeführt.
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
mc-bain
Neuer Benutzer
 
Beiträge: 3
Registriert: Mo 1. Feb 2010, 16:06

Beitragvon mc-bain » Di 2. Feb 2010, 11:45

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
mc-bain
Neuer Benutzer
 
Beiträge: 3
Registriert: Mo 1. Feb 2010, 16:06

Beitragvon akretschmer » Di 2. Feb 2010, 14:53

mc-bain hat geschrieben: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
--
ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)

https://www.xing.com/profile/Andreas_Kretschmer7
Hosting-Provider mit PostgreSQL-Support gesucht? Mich fragen!
akretschmer
Erfahrener Benutzer
 
Beiträge: 5938
Registriert: So 29. Okt 2006, 14:35
Wohnort: Kaufbach, Sachsen, Germany, Germany


Zurück zu Trigger und Funktionen

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 0 Gäste