Ergebnis 1 bis 5 von 5

Thema: Trigger und Funktion oder Regel?

  1. #1
    mc-bain ist offline Neuer Benutzer
    Registriert seit
    01.02.2010
    Beiträge
    3

    Standard Trigger und Funktion oder Regel?

    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:
     
     
    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
    Geändert von mc-bain (01.02.2010 um 16:16 Uhr)

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.330

    Standard

    Zitat Zitat von mc-bain Beitrag anzeigen
    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:
     
     
    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
    --
    PostgreSQL Hosting
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    mc-bain ist offline Neuer Benutzer
    Registriert seit
    01.02.2010
    Beiträge
    3

    Standard

    Danke für den Tip.

    Hab nun folgendes ausprobiert:

    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"();
    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

  4. #4
    mc-bain ist offline Neuer Benutzer
    Registriert seit
    01.02.2010
    Beiträge
    3

    Standard

    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

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.330

    Standard

    Zitat Zitat von mc-bain Beitrag anzeigen
    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
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    http://www.amazon.de/gp/registry/2APKFICAIYMWB
    https://www.xing.com/profile/Andreas_Kretschmer7

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum