Re: Rule Question - Mailing list pgsql-general

From Tom Lane
Subject Re: Rule Question
Date
Msg-id 7302.1374757360@sss.pgh.pa.us
Whole thread Raw
In response to Re: Rule Question  (Luca Ferrari <fluca1978@infinito.it>)
Responses Re: Rule Question
List pgsql-general
Luca Ferrari <fluca1978@infinito.it> writes:
> The original post was related to the update of b, so I guess it is
> better to limit the trigger scope to update on such column:

> CREATE OR REPLACE FUNCTION b_mirror() RETURNS TRIGGER AS
>  $mirror$
>  BEGIN
>  NEW.a = NEW.b;
>  RETURN NEW;
>  END;
>  $mirror$ LANGUAGE plpgsql;

> CREATE TRIGGER tr_b_mirror AFTER UPDATE OF b ON cats FOR EACH ROW
> EXECUTE PROCEDURE b_mirror();

> It is worth noting that the trigger could be an after one,

No, it has to be a BEFORE trigger, else it's too late to affect the
row value that gets stored.  Other than that I think this is the
best solution --- there's no reason to make the trigger any more
complicated than this.

BTW, I didn't see anyone pointing out the real reason why a rule isn't
a suitable solution for the OP's problem.  Namely, that a rule is a
macro, so if you have

create rule cats_test as on update to cats do set a = new.b;

the effect of that will be that the *expression* for the new value of b
will be inserted into the rule.  So you'll end up with double evaluation
of that expression, exactly what he wanted to avoid.  A trigger is
handed the fully calculated intended-new-row value, so it doesn't have
this issue.

            regards, tom lane


pgsql-general by date:

Previous
From: sachin kotwal
Date:
Subject: Re: Postgres 9.2.4 for Windows (Vista) Dell Vostro 400, re-installation failure (re-sent, shorter)
Next
From: V S P
Date:
Subject: Re: Why are stored procedures looked on so negatively?