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 <[EMAIL PROTECTED]> 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.                                  #
#================================================== [EMAIL PROTECTED] #

---------------------------(end of broadcast)---------------------------
TIP 6: Have you searched our list archives?

http://archives.postgresql.org

Reply via email to