I would like to create a rule that, by updating a view,
allows me to update one table and insert into another. The following example illustrates what I’m trying to
do: --Create Tables CREATE TABLE my_table ( my_table_id
serial, a
character varying(255), b
character varying(255), CONSTRAINT my_table_id_pk PRIMARY KEY (my_table_id) ); CREATE TABLE my_audit_table ( audit_id
serial, my_table_id
int, c
character varying(255), CONSTRAINT audit_id_pk PRIMARY KEY (audit_id) ); --Create View CREATE OR REPLACE VIEW my_view AS SELECT t.my_table_id, t.a, t.b, au.audit_id, au.c FROM my_table
t, my_audit_table au WHERE t.my_table_id
= au.my_table_id; --Create Rules CREATE OR REPLACE RULE insert_to_my_view AS ON INSERT TO my_view DO INSTEAD( INSERT INTO my_table (a,b) VALUES(new.a, new.b); INSERT INTO my_audit_table(my_table_id, c) VALUES (currval('my_table_my_table_id_seq'), new.c); ); CREATE OR REPLACE RULE update_my_view AS ON UPDATE TO my_view DO INSTEAD ( UPDATE my_table SET a
= new.a, b
= new.b WHERE my_table_id
= old.my_table_id; INSERT INTO my_audit_table (my_table_id,
c)
VALUES (new.my_table_id,
new.c);
); --The insert statement below inserts one row into my_table,
and one row into my_audit_table --(This works the way I would like) insert into my_view(a,b,c) values('a contents','b contents',
'c contents'); --The update statement below doesn’t work the way I
want. --What I would like this to do is to update one row in
my_table, and insert --one row into my_audit table. It does the update
fine, but the insert to my_audit_table --doesn't work as I had anticipated. update my_view set a = 'new a contents', b = 'new b
contents', c = 'new c contents' where my_table_id = 1; -- If I execute the above update statement multiple times,
multiple rows will be --inserted with each call after the first call. -- --Specifically, --after the first call, 1 row is inserted --after the second call, 2 rows are inserted --after the third call, 4 rows are inserted --after the fourth call, 8 rows are inserted... and so on -- --The problem is due to the INSERT in the update_my_view
rule: -- --INSERT INTO my_audit_table --
(my_table_id, --
c) --VALUES --
(new.my_table_id, --
new.c); -- --Apparently, "new.my_table_id" in this case
references more than one row, if more than one row with --the given id already exists in my_audit_table. -- --How do I accomplish what I want to accomplish here?
I'd prefer not to use a sp. Thanks, Chad |