Thread: view rules
Hi everybody, I am trying to create an update rule for a view. It's created fine, and I can find it in pg_rules, but when I try to update the view, I get the usual error: ERROR: Cannot update a view without an appropriate rule. My rule definitions is as follows: CREATE RULE update_priority AS ON UPDATE TO progress_report WHERE NEW.priority != OLD.priority DO INSTEAD UPDATE activity SET priority=NEW.priority WHERE activity.productcode = OLD.product_code AND activity.actname=OLD.component; I am trying to update the view as follows: update progress_report set priority=2 where product_code='m3' and component='act'; activity is a table. I can't figure out what's wrong. Please help. thanks, Oleg
On Thu, Dec 06, 2001 at 01:17:44PM -0700, Oleg Lebedev wrote: > Hi everybody, > I am trying to create an update rule for a view. It's created fine, and > I can find it in pg_rules, but when I try to update the view, I get the > usual error: > ERROR: Cannot update a view without an appropriate rule. > > My rule definitions is as follows: > CREATE RULE update_priority AS ON UPDATE TO progress_report > WHERE NEW.priority != OLD.priority > DO INSTEAD UPDATE activity SET priority=NEW.priority > WHERE activity.productcode = OLD.product_code > AND activity.actname=OLD.component; > > I am trying to update the view as follows: > update progress_report set priority=2 where product_code='m3' and > component='act'; > The View/Rule system is very picky: you have to have rules to cover _every_ possible update case before it'll allow any to go through. The usual way aroun this is to create a 'do nothing' rule with no WHERE clause: ifs_test=# create rule update_any as ON UPDATE TO progress_report DO INSTEAD NOTHING; ifs_test=# select * from progress_report;priority | product_code | component ----------+--------------+----------- 1 | 3 | act (1 row) ifs_test=# update progress_report set priority=2 where product_code='3' and component='act'; UPDATE 1 ifs_test=# select * from progress_report;priority | product_code | component ----------+--------------+----------- 2 | 3 | act (1 row) (I fudged your product code, since I'd created an int in my test case: if you'd sent along schema for the table, my test would have gone _much_ faster) Ross -- Ross Reedstrom, Ph.D. reedstrm@rice.edu Executive Director phone: 713-348-6166 Gulf Coast Consortium for Bioinformatics fax: 713-348-6182 Rice University MS-39 Houston, TX 77005
Thanks a lot Ross, that fixed my problem. I think it should be mentioned in PostgreSQL tutorial (in Al Bundy's example). thanks again, Oleg "Ross J. Reedstrom" wrote: > On Thu, Dec 06, 2001 at 01:17:44PM -0700, Oleg Lebedev wrote: > > Hi everybody, > > I am trying to create an update rule for a view. It's created fine, and > > I can find it in pg_rules, but when I try to update the view, I get the > > usual error: > > ERROR: Cannot update a view without an appropriate rule. > > > > My rule definitions is as follows: > > CREATE RULE update_priority AS ON UPDATE TO progress_report > > WHERE NEW.priority != OLD.priority > > DO INSTEAD UPDATE activity SET priority=NEW.priority > > WHERE activity.productcode = OLD.product_code > > AND activity.actname=OLD.component; > > > > I am trying to update the view as follows: > > update progress_report set priority=2 where product_code='m3' and > > component='act'; > > > > The View/Rule system is very picky: you have to have rules to cover > _every_ possible update case before it'll allow any to go through. > The usual way aroun this is to create a 'do nothing' rule with no WHERE > clause: > > ifs_test=# create rule update_any as ON UPDATE TO progress_report DO INSTEAD NOTHING; > > ifs_test=# select * from progress_report; > priority | product_code | component > ----------+--------------+----------- > 1 | 3 | act > (1 row) > > ifs_test=# update progress_report set priority=2 where product_code='3' and component='act'; > UPDATE 1 > ifs_test=# select * from progress_report; > priority | product_code | component > ----------+--------------+----------- > 2 | 3 | act > (1 row) > > (I fudged your product code, since I'd created an int in my test case: if > you'd sent along schema for the table, my test would have gone _much_ faster) > > Ross > -- > Ross Reedstrom, Ph.D. reedstrm@rice.edu > Executive Director phone: 713-348-6166 > Gulf Coast Consortium for Bioinformatics fax: 713-348-6182 > Rice University MS-39 > Houston, TX 77005