Обсуждение: Rules WHERE condition

Поиск
Список
Период
Сортировка

Rules WHERE condition

От
Robert Fitzpatrick
Дата:
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


Re: Rules WHERE condition

От
Michael Fuhr
Дата:
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/

Re: Rules WHERE condition

От
Robert Fitzpatrick
Дата:
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


Re: Rules WHERE condition

От
Robert Fitzpatrick
Дата:
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