Trigger und Rules kommen sich in die Quere

Hallo,

ich habe folgendes Problem:

Für einige meiner Tabellen habe ich eine RULE, welche ein insert in einer anderen Tabelle loggt. Die insert rule sieht so aus:

CREATE OR REPLACE RULE order_item_insert AS
ON INSERT TO orders.order_item DO
INSERT INTO orders.allstatus (obj_name, obj_id, status)
VALUES (‘order_item’, currval(‘order_item_id_seq’), ‘NEU’);

D.h. die order_item.id wird in allstatus.obj_id eingetragen.
order_item.id wird durch eine Sequence generiert.

Soweit klappt das auch.

Jetzt habe ich einen Trigger, der beim insert in order_item (bzw. in eine Tabelle, die von dieser erbt, aber das spielt keine Rolle ) weitere Einträge in order_item erzeugt. Die order_item_insert rule wird dabei natürlich jedesmal auch ausgeführt.

Das Problem:
Das (erste) insert in order_item erhöht die Seqence für den PK,
jedes insert des Trigger auch, aber die Rule des ersten inserts trägt dann den Wert des letzen ein. Alles klar ?
Beispiel:

pgp=#select currval(‘order_item_id_seq’);
currval

186
pgp=# insert into bilder_item ( trans_id, article_id, quantity , typ_id) values (41, 19, 3,80);
INSERT 1134161 1
pgp=# select currval(‘order_item_id_seq’);
currval

190
(1 Zeile)

pgp=# select * from allstatus where obj_id > 186;
id | time_stamp | obj_id | status | obj_name
-----±---------------------------±-------±-------±-----------
196 | 2006-10-06 18:00:22.805667 | 188 | NEU | order_item
197 | 2006-10-06 18:00:22.805667 | 189 | NEU | order_item
198 | 2006-10-06 18:00:22.805667 | 190 | NEU | order_item
199 | 2006-10-06 18:00:22.805667 | 190 | NEU | order_item

================================================================
Das Insert erzeugt einen Eintrag mit der id 187,
der Trigger erzeugt die order_items mit den ids 188-190.
In allstatus gibt es jetzt ZWEI Einträge mit der obj_id 190,
aber keinen mit 187 !

Jetzt habe ich meine rule geändert zu:

CREATE OR REPLACE RULE order_item_insert AS
ON INSERT TO orders.order_item DO INSERT INTO orders.allstatus (obj_name, obj_id, status)
VALUES (‘order_item’::character varying, new.id, ‘NEU’::character varying);

Dann passiert etwas noch seltsameres:
Die Werte in allstatus.obj_id sind jeweils um 1 zu gross, d.h die sequence wird zwei mal incrementiert.

Wer weiß Rat ?


Rolf Schaufelberger
rs@plusw.de