From: | Peter Wullinger <some-mail-drop(at)gmx(dot)net> |
---|---|
To: | Joerg Brenzis <technik(at)jb2c(dot)de> |
Cc: | pgsql-de-allgemein(at)postgresql(dot)org |
Subject: | Re: Kopie eines Datensatzes via Trigger |
Date: | 2004-10-29 11:06:54 |
Message-ID: | 20041029110654.GB8372@peter.home.wul |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-de-allgemein |
In epistula a Joerg Brenzis, die horaque Fri, Oct 29, 2004 at 11:38:17AM +0200:
> Hi,
Mahlzeit ;-),
> was pl/pgsql angeht, bin ich noch sehr unerfahren und habe es mit einem
> Problem zu tun,
> dass ich auch durch lesen der Doco nicht beseitigt bekomme.
>
Steht im Großen und Ganzen alles dort drin:
http://developer.postgresql.org/docs/postgres/plpgsql-trigger.html
Genaues Hinschauen empfiehlt sich allerdings, man übersieht leicht
einige syntaktische und semantische Feinheiten.
>
> Ich hoffe, dass ich hier vielleicht ein Lösungsansatz bekommen kann.
>
> Auszug was DB-Seitig passieren soll:
>
> [code]
> CREATE TRIGGER "table_trigger_histo" AFTER UPDATE
> ON "public"."table_inv" FOR EACH ROW
> EXECUTE PROCEDURE "public"."table_function_histo"();
>
> CREATE OR REPLACE FUNCTION "public"."table_function_histo" () RETURNS
> trigger AS'
> BEGIN
> INSERT INTO table_histo
> (
> inv_id,
> modell_id,
> ...
> ) VALUES (
> old.inv_id,
> old.modell_id,
> old. ....
> )
^^
da fehlt ein “;”
Zudem solltest du danach noch ein “RETURN new;” einbauen.
> end;
> 'LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER;
> [/code]
>
Zum Querverifizieren ein funktionierendes Beispiel
in vereinfachter Form:
== simple_history.sql ==
DROP TABLE inventory;
CREATE TABLE inventory (
id INTEGER PRIMARY KEY
);
DROP TABLE inventory_history;
CREATE TABLE inventory_history (
id INTEGER PRIMARY KEY,
modified TIMESTAMP DEFAULT NOW
);
DROP TRIGGER trig_inventory_history_update
ON inventory;
CREATE TRIGGER trig_inventory_history_update
AFTER UPDATE ON inventory
FOR EACH ROW EXECUTE PROCEDURE proc_inventory_history_update();
CREATE OR REPLACE FUNCTION proc_inventory_history_update()
RETURNS trigger AS '
BEGIN
INSERT INTO inventory_history (
id
) VALUES (
old.id
);
RETURN new;
END;
' LANGUAGE 'plpgsql';
== simple_history.sql ==
psql: ~# INSERT INTO inventory (id) VALUES (1);
psql: ~# UPDATE inventory SET id = 2 WHERE id = 1;
psql: ~# SELECT * FROM inventory_history;
id | modified
----+----------------------------
1 | 2004-10-29 13:02:56.921131
(1 row)
>
> Doch leider bekomme ich, wenn ich ein Update auf table_inv mache nur ein
> Syntax-Fehler, der aber keine genaue Angaben macht.o
>
Zeilenangabe ist aber schon dabei, oder? Sonst wäre da ja sogar
ein Parser-Bug.
Gruß,
Peter
--
Zweifel ist keine angenehme Voraussetzung, aber Gewißheit ist eine absurde.
-- François Marie Arouet Voltaire
From | Date | Subject | |
---|---|---|---|
Next Message | Andreas Kretschmer | 2004-10-31 17:04:23 | Ein Neuer ... |
Previous Message | Janko Richter | 2004-10-29 10:39:20 | Re: Kopie eines Datensatzes via Trigger |