Rules WHERE condition

Started by Robert Fitzpatrickover 21 years ago4 messagesgeneral
Jump to latest
#1Robert Fitzpatrick
robert@webtent.com

I have a view that used union all to merge three tables together. I was
hoping to create a rule, one for each table using the WHERE condition of
the rule to determine which table gets updated. Is this possible?

This is what I have, assume the view here is a merge of three tables
using union all:

CREATE RULE "update_xrf" AS ON UPDATE TO "public"."viewdeterioratedlbp"
WHERE ((new.note)::text = 'Unit'::text)
DO INSTEAD (UPDATE tblxrf SET deterioration = new.deterioration;);

The note column contains a value that can trigger which table needs to
be updated. I would like to make one of these rules for each table to
update. But when I run the update, it says I have to have an
unconditional rule, is that right? Any suggestions?

ohc=# update viewdeterioratedlbp set note = 'Unit', deterioration =
'test' where xrf_id = 733;
ERROR: cannot update a view
HINT: You need an unconditional ON UPDATE DO INSTEAD rule.

Thanks,
--
Robert

#2Michael Fuhr
mike@fuhr.org
In reply to: Robert Fitzpatrick (#1)
Re: Rules WHERE condition

On Wed, Nov 17, 2004 at 11:20:41AM -0500, Robert Fitzpatrick wrote:

I have a view that used union all to merge three tables together. I was
hoping to create a rule, one for each table using the WHERE condition of
the rule to determine which table gets updated. Is this possible?

See the CREATE RULE documentation:

http://www.postgresql.org/docs/7.4/static/sql-createrule.html

In particular, read the last paragraph of the Description section,
the one that begins, "There is a catch if you try to use conditional
rules for view updates...."

--
Michael Fuhr
http://www.fuhr.org/~mfuhr/

#3Robert Fitzpatrick
robert@webtent.com
In reply to: Michael Fuhr (#2)
Re: Rules WHERE condition

On Wed, 2004-11-17 at 11:49, Michael Fuhr wrote:

On Wed, Nov 17, 2004 at 11:20:41AM -0500, Robert Fitzpatrick wrote:

I have a view that used union all to merge three tables together. I was
hoping to create a rule, one for each table using the WHERE condition of
the rule to determine which table gets updated. Is this possible?

See the CREATE RULE documentation:

http://www.postgresql.org/docs/7.4/static/sql-createrule.html

Thanks, that explains a lot, but still not able to get my rule to work,
this is what I have now:

CREATE RULE "update_unconditional" AS ON UPDATE TO
"public"."viewdeterioratedlbp"
DO INSTEAD NOTHING;

CREATE RULE "update_xrf" AS ON UPDATE TO "public"."viewdeterioratedlbp"
WHERE ((new.note)::text = 'Unit'::text)
DO (UPDATE tblxrf SET deterioration = new.deterioration WHERE
(tblxrf.xrf_id = new.xrf_id););

ohc=# update viewdeterioratedlbp set deterioration = 'test' where xrf_id
= 143;
UPDATE 0

This is the first rule I have tried to setup, I read through the doc,
but don't seem to be able to catch what I'm doing wrong. Do I have to
update all fields for it to work?

--
Robert

#4Robert Fitzpatrick
robert@webtent.com
In reply to: Robert Fitzpatrick (#3)
Re: Rules WHERE condition

On Wed, 2004-11-17 at 12:49, Robert Fitzpatrick wrote:

On Wed, 2004-11-17 at 11:49, Michael Fuhr wrote:

On Wed, Nov 17, 2004 at 11:20:41AM -0500, Robert Fitzpatrick wrote:

I have a view that used union all to merge three tables together. I was
hoping to create a rule, one for each table using the WHERE condition of
the rule to determine which table gets updated. Is this possible?

See the CREATE RULE documentation:

http://www.postgresql.org/docs/7.4/static/sql-createrule.html

Thanks, that explains a lot, but still not able to get my rule to work,
this is what I have now:

Forget that last post, it is working even though the UPDATE 0 is
returned. The record did update :)

Please someone let me know if you see any issues with that? Like I said,
my first rule let alone with a WHERE condition.

--
Robert