Skip site navigation (1) Skip section navigation (2)

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 (view raw or flat)
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

pgsql-de-allgemein by date

Next:From: Andreas KretschmerDate: 2004-10-31 17:04:23
Subject: Ein Neuer ...
Previous:From: Janko RichterDate: 2004-10-29 10:39:20
Subject: Re: Kopie eines Datensatzes via Trigger

Privacy Policy | About PostgreSQL
Copyright © 1996-2014 The PostgreSQL Global Development Group