Re: DO INSTEAD and conditional rules - Mailing list pgsql-hackers
From | Jan Wieck |
---|---|
Subject | Re: DO INSTEAD and conditional rules |
Date | |
Msg-id | 426E9306.6090702@Yahoo.com Whole thread Raw |
In response to | Re: DO INSTEAD and conditional rules (Rob Butler <crodster2k@yahoo.com>) |
Responses |
Re: DO INSTEAD and conditional rules
|
List | pgsql-hackers |
On 4/26/2005 3:01 PM, Rob Butler wrote: > Are rules even needed anymore? Can't you do this all > with triggers? If you want to "DO INSTEAD" just use a > row based trigger, and return null. Or is this less > efficient? On INSERT, yes, on UPDATE, how so? Jan > > Later > Rob > --- David Wheeler <david@kineticode.com> wrote: >> On Apr 26, 2005, at 8:55 AM, Tom Lane wrote: >> >> > Well, they handle simple situations OK, but we >> keep seeing people get >> > burnt as soon as they venture into interesting >> territory. For >> > instance, >> > if the view is a join, you can't easily make a >> rule that turns a delete >> > into deletions of both joined rows. And you'll >> get burnt if you try to >> > insert any volatile functions, because of the >> multiple-evaluation >> > issue. >> > Etc. >> >> sharky=# CREATE TABLE a ( >> sharky(# id int, >> sharky(# name text >> sharky(# ); >> CREATE TABLE >> sharky=# CREATE TABLE b ( >> sharky(# a_id int, >> sharky(# rank text >> sharky(# ); >> CREATE TABLE >> sharky=# >> sharky=# CREATE VIEW ab AS >> sharky-# SELECT id, name, rank >> sharky-# FROM a, b >> sharky-# WHERE a.id = b.a_id >> sharky-# ; >> CREATE VIEW >> sharky=# CREATE RULE delete_ab AS >> sharky-# ON DELETE TO ab DO INSTEAD ( >> sharky(# DELETE FROM b >> sharky(# WHERE a_id = OLD.id; >> sharky(# >> sharky(# DELETE FROM a >> sharky(# WHERE id = OLD.id; >> sharky(# ); >> CREATE RULE >> sharky=# >> sharky=# >> sharky=# insert into a values (1, 'test'); >> INSERT 597795 1 >> sharky=# insert into b values (1, 'sergeant'); >> INSERT 597796 1 >> sharky=# select * from ab; >> id | name | rank >> ----+------+---------- >> 1 | test | sergeant >> (1 row) >> >> sharky=# delete from ab; >> DELETE 0 >> sharky=# select * from ab; >> id | name | rank >> ----+------+------ >> (0 rows) >> >> sharky=# select * from a; >> id | name >> ----+------ >> 1 | test >> (1 row) >> >> sharky=# select * from b; >> a_id | rank >> ------+------ >> (0 rows) >> >> Ah, yes, you're right, that is...unexpected. Perhaps >> OLD can contain >> its values for the duration of the RULE's >> statements? I'm assuming that >> what's happening is that OLD.id is NULL after the >> first of the two >> DELETE statements... >> >> > Like I said, I don't have a better idea. Just a >> vague feeling of >> > dissatisfaction. >> >> I'd call it a bug. ;-) >> >> Regards, >> >> David >> >> >> ---------------------------(end of >> broadcast)--------------------------- >> TIP 6: Have you searched our list archives? >> >> http://archives.postgresql.org >> > > __________________________________________________ > Do You Yahoo!? > Tired of spam? Yahoo! Mail has the best spam protection around > http://mail.yahoo.com -- #======================================================================# # It's easier to get forgiveness for being wrong than for being right. # # Let's break this rule - forgive me. # #================================================== JanWieck@Yahoo.com #
pgsql-hackers by date: