Re: Kopie eines Datensatzes via Trigger

Lists: pgsql-de-allgemein
From: Joerg Brenzis <technik(at)jb2c(dot)de>
To: pgsql-de-allgemein(at)postgresql(dot)org
Subject: Kopie eines Datensatzes via Trigger
Date: 2004-10-29 09:38:17
Message-ID: 41820F89.6070706@jb2c.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Hi,
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.

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. ....
)
end;
'LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER;
[/code]

Doch leider bekomme ich, wenn ich ein Update auf table_inv mache nur ein
Syntax-Fehler, der aber keine genaue Angaben macht.

Ein Update auf table_inv ohne dem Trigger und dem Functionsaufruf ist
erfolgreich. Daher kann es nur am pl/pgsql Statmend liegen. Leider bin
ich überfragt woran.

Vielleicht kann mich jemenad in die richtige Richtung anschieben.. :)
Danke!

Viele Grüße
Jörg Brenzis


From: Janko Richter <jankorichter(at)yahoo(dot)de>
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 10:39:20
Message-ID: 41821DD8.2000105@yahoo.de
Views: Raw Message | Whole Thread | Download mbox | Resend email
Lists: pgsql-de-allgemein

Hallo Jörg,

auf den ersten Blick würde ich sagen, dass "RETURN NEW" fehlt.
(siehe unten). Wenn es nicht hilft, schick mal die Fehlermeldung.

Gruß: Janko

Joerg Brenzis wrote:

> Hi,
> 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.
>
> 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. ....
> )

RETURN NEW;

> end;
> 'LANGUAGE 'plpgsql' IMMUTABLE CALLED ON NULL INPUT SECURITY INVOKER;
> [/code]
>
> Doch leider bekomme ich, wenn ich ein Update auf table_inv mache nur
> ein Syntax-Fehler, der aber keine genaue Angaben macht.
>
> Ein Update auf table_inv ohne dem Trigger und dem Functionsaufruf ist
> erfolgreich. Daher kann es nur am pl/pgsql Statmend liegen. Leider bin
> ich überfragt woran.
>
> Vielleicht kann mich jemenad in die richtige Richtung anschieben.. :)
> Danke!
>
> Viele Grüße
> Jörg Brenzis
>
> ---------------------------(end of broadcast)---------------------------
> TIP 1: subscribe and unsubscribe commands go to majordomo(at)postgresql(dot)org
>


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
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