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