Ergebnis 1 bis 9 von 9

Thema: Trigger erstellen welcher Funktion mit Parameter aufruft

  1. #1
    saladinmundi ist offline Neuer Benutzer
    Registriert seit
    11.03.2010
    Beiträge
    3

    Standard Trigger erstellen welcher Funktion mit Parameter aufruft

    Hallöchen,

    ich beschäftige mich seit kurzem mit Triggern und Funktionen. Mein Problem ist folgendes:
    Wenn eine Zeile in einer bestimmten Tabelle eingefügt wird soll dies der Trigger mitbekommen, ein Feld aus der Zeile auslesen und den Inhalt an eine Funktion übergeben.

    Die Tabelle testtable sieht folgendermaßen aus
    Code:
    ID | USERNAME
    1 | "Testname"
    2 | "John Doe"
    .. | ..
    Trigger-Versuch
    Code:
    CREATE TRIGGER testTrigger AFTER INSERT  ON testtable
        FOR EACH ROW EXECUTE PROCEDURE testfunktion(NEW.username);
    Das klappt jedoch nicht.


    Die Funktion testfunktion besteht schon und macht ihren Job korrekt. Hier der Anfang und das Ende:

    Code:
    CREATE OR REPLACE FUNCTION testfunktion(character varying)
      RETURNS void AS
    $BODY$
    ...
    end; $BODY$
      LANGUAGE 'plpgsql' VOLATILE
      COST 100;
    Leider weiß ich nicht wie ich auf eine Spalte der zuvor eingefügten Zeile im Trigger zugreifen kann und diese an die Funktion übergeben kann.

    Bestimmt könnt ihr mir dabei helfen.

    Vielen Dank im Vorraus!
    Geändert von saladinmundi (11.03.2010 um 11:15 Uhr)

  2. #2
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Die Angabe von NEW.username in der Triggerdefinition ist falsch. Diese Variable steht automatisch innerhalb der Funktion zur Verfügung, die muss nicht definiert oder übergeben werden.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  3. #3
    saladinmundi ist offline Neuer Benutzer
    Registriert seit
    11.03.2010
    Beiträge
    3

    Standard

    Ist es denn irgendwie möglich der Funktion vom Trigger aus den Wert aus der neu eingefügten Zeile zu übergeben?

    Oder muss dies in der Funktion mittels NEW ausgelesen werden?

  4. #4
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Letzteres. Wie ich gesagt habe: der Wert steht automatisch innerhalb der Funktion zur Verfügung.

    Einfach in der Funktion auf NEW.username zugreifen.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  5. #5
    pfuetz ist offline Neuer Benutzer
    Registriert seit
    11.03.2010
    Ort
    Nord Hessen
    Beiträge
    8

    Standard Trigger erstellen welcher Funktion aufruft: Beispiel

    Kleines Beispiel von mir:

    CREATE TABLE p(
    id text NOT NULL, -- Id des Datensatzes
    bemerkung text, -- Bemerkungen
    "timestamp" timestamp with time zone DEFAULT ('now'::text)::timestamp without time zone, -- Zeit der Aenderung
    CONSTRAINT p_pkey PRIMARY KEY (id)
    );

    CREATE OR REPLACE FUNCTION timestamp_upd()
    RETURNS trigger AS
    $BODY$BEGIN
    NEW.timestamp:='now';
    RETURN NEW;
    END;$BODY$
    LANGUAGE 'plpgsql' VOLATILE;

    CREATE TRIGGER upd_timestamp_p
    BEFORE INSERT OR UPDATE
    ON p
    FOR EACH ROW
    EXECUTE PROCEDURE timestamp_upd();

    Grüße

    Michael

  6. #6
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Nimm NOW() statt 'now', andernfalls muss die Datenbank intern erst einen Cast durchführen ;-)
    Aber sonst sehr gut.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  7. #7
    saladinmundi ist offline Neuer Benutzer
    Registriert seit
    11.03.2010
    Beiträge
    3

    Standard

    Vielen Dank für eure zahlreichen Antworten.
    Es hat mir sehr geholfen!

  8. #8
    pfuetz ist offline Neuer Benutzer
    Registriert seit
    11.03.2010
    Ort
    Nord Hessen
    Beiträge
    8

    Standard

    Zitat Zitat von ads Beitrag anzeigen
    Nimm NOW() statt 'now', andernfalls muss die Datenbank intern erst einen Cast durchführen ;-)
    Aber sonst sehr gut.
    Ok, hast recht.
    Werde ich ändern!

    Hatte ich (wahrscheinlich) durch irgendwelche dumps mit alten Tools verloren.
    Ursprünglich stand da auch mal now().
    Benutze die Funktion schon seit Jahren ...

    Danke

    Michael

  9. #9
    pfuetz ist offline Neuer Benutzer
    Registriert seit
    11.03.2010
    Ort
    Nord Hessen
    Beiträge
    8

    Standard

    CREATE TABLE p(
    id text NOT NULL, -- Id des Datensatzes
    bemerkung text, -- Bemerkungen
    "timestamp" timestamp with time zone DEFAULT now(), -- Zeit der Aenderung
    CONSTRAINT p_pkey PRIMARY KEY (id)
    );

    CREATE OR REPLACE FUNCTION timestamp_upd()
    RETURNS trigger AS
    $BODY$
    BEGIN
    NEW.timestamp:=now();
    RETURN NEW;
    END;
    $BODY$
    LANGUAGE 'plpgsql' VOLATILE;

    CREATE TRIGGER upd_timestamp_p
    BEFORE INSERT OR UPDATE
    ON p
    FOR EACH ROW
    EXECUTE PROCEDURE timestamp_upd();

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