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
Trigger-VersuchCode:ID | USERNAME 1 | "Testname" 2 | "John Doe" .. | ..
Das klappt jedoch nicht.Code:CREATE TRIGGER testTrigger AFTER INSERT ON testtable FOR EACH ROW EXECUTE PROCEDURE testfunktion(NEW.username);
Die Funktion testfunktion besteht schon und macht ihren Job korrekt. Hier der Anfang und das Ende:
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.Code:CREATE OR REPLACE FUNCTION testfunktion(character varying) RETURNS void AS $BODY$ ... end; $BODY$ LANGUAGE 'plpgsql' VOLATILE COST 100;
Bestimmt könnt ihr mir dabei helfen.
Vielen Dank im Vorraus!
Geändert von saladinmundi (11.03.2010 um 11:15 Uhr)
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
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.
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
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 ;-)
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
Vielen Dank für eure zahlreichen Antworten.
Es hat mir sehr geholfen!
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();
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen