RE: Updating two table via a Rule?

From: Michael Davis <mdavis(at)sevainc(dot)com>
To: "'PostgreSQL-SQL'" <pgsql-sql(at)postgresql(dot)org>
Subject: RE: Updating two table via a Rule?
Date: 2001-01-01 10:41:04
Message-ID: 01C073A4.ACE62A90.mdavis@sevainc.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: 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(at)sevainc(dot)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

Browse pgsql-sql by date

  From Date Subject
Next Message Ferruccio Zamuner 2001-01-01 15:48:35 resetting serials and sequences
Previous Message Michael Davis 2001-01-01 10:19:37 Updating two table via a Rule?