Re: Newbie question on RULEs .. or .. bug ?

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: Leif Jensen <leif(at)crysberg(dot)dk>
Cc: pgsql-general(at)postgresql(dot)org, Brian Grønborg <bg(at)crysberg(dot)dk>
Subject: Re: Newbie question on RULEs .. or .. bug ?
Date: 2005-05-17 16:05:41
Message-ID: 28922.1116345941@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-general

Leif Jensen <leif(at)crysberg(dot)dk> writes:
> CREATE RULE update_tasks2taskshead AS
> ON UPDATE TO tasks WHERE NEW.seq = 0
> DO NOTHING
> ;

That rule looks a bit useless ...

> CREATE RULE update_tasks2ganntinfo AS
> ON UPDATE TO tasks
> DO INSTEAD (
> update ganntinfo set
> id = NEW.id, seq = NEW.seq, category = NEW.category, name = NEW.name
> -- WHERE id = NEW.id AND seq = NEW.seq AND category = NEW.category
> ;
> )
> ;

You definitely need a WHERE clause in that rule; otherwise you get
exactly the result you saw: all rows of ganntinfo are updated. The
comment in the manual about the original WHERE clause really means
that the values of "NEW" will be constrained to take on only the
values determined by the original WHERE. Your update is basically a join
of ganntinfo with the subset of the tasks view determined by the
original WHERE --- so you have to constrain ganntinfo too. I suppose
that you want something like

update ganntinfo set
category = NEW.category, name = NEW.name
WHERE id = NEW.id AND seq = NEW.seq
;

since id/seq is your primary key for ganntinfo.

regards, tom lane

In response to

Responses

Browse pgsql-general by date

  From Date Subject
Next Message Rich Doughty 2005-05-17 16:19:56 Re: perl and insert
Previous Message Hrishikesh Deshmukh 2005-05-17 16:04:10 perl and insert