RE: Updating two table via a Rule? - Mailing list pgsql-sql

From Michael Davis
Subject RE: Updating two table via a Rule?
Date
Msg-id 01C073A4.ACE62A90.mdavis@sevainc.com
Whole thread Raw
In response to Updating two table via a Rule?  (Michael Davis <mdavis@sevainc.com>)
List pgsql-sql
I just answered my question.  For anyone how may be interested, here is the 
answer.  The following create rule allows multiple actions.  This was not 
very clear from the documentation.  Would some be willing to suggest to the 
documentation group to add an example of a rule with multiple actions?   I 
stumbled onto this syntax in an email on the hacker list after several 
hours of research.

CREATE RULE reg_PaymentLines_r1 AS ON INSERT TO reg_PaymentLines  DO INSTEAD (     INSERT INTO Payments (MemberID,
PaymentsID,    PaymentDate,    Amount)                VALUES (new.MemberID, new.PaymentsID, new.PaymentDate, 
 
new.Amount);     INSERT INTO PaymentLines (MemberID,  PaymentsID,     PaymentLineID, 
Amount)                    VALUES (new.MemberID, new.PaymentsID, 
new.PaymentLineID, new.Amount);     );

Here is an insert that works:

insert into reg_PaymentLines (MemberID, PaymentsID, PaymentDate, 
PaymentLineID, Amount)                                VALUES(99999,      777777,      '1/1/2001',
nextval('PaymentLines_s'),10);
 

Here is the insert that is failing:

insert into reg_PaymentLines (MemberID, PaymentsID, PaymentDate, 
PaymentLineID, Amount)          VALUES(99999, nextval('Payments_s'),  '1/1/2001', 
nextval('PaymentLines_s'), 10);

The Payments_s sequences is bumped on both inserts.  As a result, the 
insert into the PaymentLines table has a different PaymentsID that the 
insert into the Payments table.

Thanks, Michael Davis

-----Original Message-----
From:    Michael Davis [SMTP:mdavis@sevainc.com]
Sent:    Monday, January 01, 2001 3:20 AM
To:    PostgreSQL-SQL
Subject:    Updating two table via a Rule?

How do I create a rule for a view that inserts into two tables?

I have a view based on two tables.  I would like to create insert, update, 
and delete rules for this view to:

- update both tables when the view is updated
- delete from both tables when a record is deleted from the view
- insert into both table when a record is inserted into the view

Here is the view:
CREATE VIEW reg_PaymentLines AS  SELECT P.MemberID, P.PaymentsID, P.PaymentDate,           PL.PaymentLineID,
PL.PaymentTypesID,PL.Amount     FROM Payments P, PaymentLines PL     WHERE P.PaymentsID = PL.PaymentsID;
 

I have tried to create two insert rules on the view as follows:

CREATE RULE reg_PaymentLines_r1 AS ON INSERT TO reg_PaymentLines  DO INSTEAD     INSERT INTO PaymentLines (PaymentsID,
PaymentLineID,Amount)                    VALUES (new.PaymentsID, new.PaymentLineID, 
 
new.Amount);

CREATE RULE reg_PaymentLines_r2 AS ON INSERT TO reg_PaymentLines  DO INSTEAD     INSERT INTO Payments (MemberID,
PaymentsID,    PaymentDate,    Amount)                VALUES (new.MemberID, new.PaymentsID, new.PaymentDate, 
 
new.Amount);

PostgreSQL allows me to create the two rules.  However, when I insert into 
the view, I get a foreign key constraint violation because the PaymentID 
does not exist in the Payments table.  There is a foreign key constraint 
from PaymentLines.PaymentsID to Payments.PaymentsID.  It appears that 
either:

- the insert into the PaymentLines table before the insert occurs in the 
Payments tables

- or that the insert into the PaymentLines table is not aware of the insert 
into the Payments table.

- or that the insert to the Payments table is being ignored

I get the same error regardless of how the two rules are created (i.e. same 
error if rule #2 is applied before rule #1).

Any suggestions on how to get this to work?  Any help is greatly 
appreciated.

Thanks, Michael Davis




pgsql-sql by date:

Previous
From: Michael Davis
Date:
Subject: Updating two table via a Rule?
Next
From: Ferruccio Zamuner
Date:
Subject: resetting serials and sequences