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

ID | USERNAME
1 | "Testname"
2 | "John Doe"
.. | ..

Trigger-Versuch

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:

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!

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.

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?

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

Einfach in der Funktion auf NEW.username zugreifen.

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

Nimm NOW() statt ‘now’, andernfalls muss die Datenbank intern erst einen Cast durchführen :wink:
Aber sonst sehr gut.

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

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

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