Re: Kopie eines Datensatzes via Trigger

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

In response to

Browse pgsql-de-allgemein by date

  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