Обсуждение: Problems using a rule with the WHERE clause
Hello <p>I'm using a rule without a WHERE clause that's working fine. Now a have to put a where clause because I only wantthe rule be get executed only in some occasions, but I'm having some problems with that. <p>This rule is over a viewcalled docentesturno. <p>The code that I was using in the rule when I didn't had the WHERE clause was: <p><b>CREATE RULE"updateturnodocente" AS ON UPDATE TO "docentesturno"</b><br /><b> DO INSTEAD (</b><br /><b> UPDATE "pessoalEvento"</b><br/><b> SET "idPessoal" = NEW."idpessoal",</b><br /><b> ponderacao = NEW.ponderacao,</b><br /><b> envolvimento = NEW.envolvimento</b><br /><b> WHERE id_pe = OLD.id_pe;</b><br /><b> );</b><br /> <p>Now the codefor the rule with WHERE: <p><b>CREATE RULE "updateturnodocente" AS ON UPDATE TO "docentesturno"</b><br /><b> WHERE OLD.idpessoal!= 0</b><br /><b> DO INSTEAD (</b><br /><b> UPDATE "pessoalEvento"</b><br /><b> SET "idPessoal" = NEW."idpessoal",</b><br/><b> ponderacao = NEW.ponderacao,</b><br /><b> envolvimento = NEW.envolvimento</b><br /><b> WHERE id_pe = OLD.id_pe;</b><br /><b> );</b><b></b><p>When I execute the INSERT into de view docentesturno I got themessage: <br /> ERROR: Cannot update a view without an appropriate rule <br /> <p>Do someone knows what canbe the problem in this rule? <br />Apparently I'm doing in the same way of the manual, chapter 13.7.2 !!!!!!! <br /> <br /> <p>Best regards <p>Luis Sousa
Luis Sousa <llsousa@ualg.pt> writes:
> CREATE RULE "updateturnodocente" AS ON UPDATE TO "docentesturno"
> WHERE OLD.idpessoal != 0
> DO INSTEAD (
> ...
> When I execute the INSERT into de view docentesturno I got the message:
> ERROR: Cannot update a view without an appropriate rule
You failed to supply a rule covering the case OLD.idpessoal = 0.
More specifically, you *must* supply an unconditional INSTEAD rule to
replace the attempt to insert/update in the view. Possibly what you
want is
CREATE RULE "updateturnodocente" AS ON UPDATE TO "docentesturno"
WHERE OLD.idpessoal != 0
DO ( ... );
CREATE RULE "updateturnodocente_default" AS ON UPDATE TO "docentesturno"
DO INSTEAD NOTHING;
Here, the unconditional rule always fires, and the conditional one fires
only when its condition is true.
regards, tom lane
Tom, I wrote the rule as you mentioned and I resolve that problem, but after some tests I realize that the system wasn't following the condition inside the WHERE clause, to determine which rule to use There's an example used: CREATE RULE "updateturnodocente_default" AS ON UPDATE TO "docentesturno"DO INSTEAD NOTHING; CREATE RULE "updateturnodocente_all" AS ON UPDATE TO "docentesturno"WHERE OLD.idpessoal = 338DO INSTEAD (UPDATE "pessoalEvento"SET ponderacao = NEW.ponderacao, envolvimento = NEW.envolvimento WHERE id_pe = OLD.id_pe;); CREATE RULE "updateturnodocente" AS ON UPDATE TO "docentesturno"WHERE OLD.idpessoal = 0DO INSTEAD (UPDATE "pessoalEvento"SET "idPessoal" = NEW."idpessoal", ponderacao = NEW.ponderacao, envolvimento = NEW.envolvimento WHERE id_pe= OLD.id_pe;); I tried with the first two rules and it worked, but when I add the third, I got an error. I think this code is OK !!!!! But I got the error message bellow in line 11 of my script, that corresponds to the rule updateturnodocente_default psql:dev/pessoal/def/views_rules/teste_update:11: pqReadData() -- backend closed the channel unexpectedly. This probably means the backend terminated abnormally before or while processingthe request. psql:dev/pessoal/def/views_rules/teste_update:11: connection to server was lost What can be happening ??? Best regards Luis Sousa Tom Lane wrote: > Luis Sousa <llsousa@ualg.pt> writes: > > CREATE RULE "updateturnodocente" AS ON UPDATE TO "docentesturno" > > WHERE OLD.idpessoal != 0 > > DO INSTEAD ( > > ... > > > When I execute the INSERT into de view docentesturno I got the message: > > ERROR: Cannot update a view without an appropriate rule > > You failed to supply a rule covering the case OLD.idpessoal = 0. > > More specifically, you *must* supply an unconditional INSTEAD rule to > replace the attempt to insert/update in the view. Possibly what you > want is > > CREATE RULE "updateturnodocente" AS ON UPDATE TO "docentesturno" > WHERE OLD.idpessoal != 0 > DO ( ... ); > > CREATE RULE "updateturnodocente_default" AS ON UPDATE TO "docentesturno" > DO INSTEAD NOTHING; > > Here, the unconditional rule always fires, and the conditional one fires > only when its condition is true. > > regards, tom lane > > ---------------------------(end of broadcast)--------------------------- > TIP 4: Don't 'kill -9' the postmaster
Luis Sousa <llsousa@ualg.pt> writes:
> I think this code is OK !!!!!
You probably don't want the second and third rules to be INSTEAD.
However,
> But I got the error message bellow in line 11
> of my script, that corresponds to the rule updateturnodocente_default
>
> psql:dev/pessoal/def/views_rules/teste_update:11: pqReadData() -- backend
> closed the channel unexpectedly.
that shouldn't happen, in any case. If this is the current release
(7.1.2) then I'd like to see a complete script to reproduce the problem.
(I don't have time to guess at your table declarations...)
regards, tom lane
> that shouldn't happen, in any case. If this is the current release
> (7.1.2)
The version that I'm using is 7.1release-3.potato.1
> then I'd like to see a complete script to reproduce the problem.
> (I don't have time to guess at your table declarations...)
I try a simple example that works fine. (see attached)
Then I create a script from the database only with the main tables that are
involved (see attached - script_def.tar.gz).
When I execute the file run_update, that only updates three fields on the
records with turno=15, I'm getting some errors (sometimes I got the 1st error
and other times I got de 2nd error):
- ERROR: JOIN qualification may not refer to other relations
- ERROR: ExecEvalExpr: unknown expression type 501
The script contains two tables, evento and pessoalEvento, and the view
docentesturno that JOIN's both tables.
The update is done over docentesturno using run_update.
Thank you for your help. Best Regards
Luis Sousa
Вложения
Luis Sousa <llsousa@ualg.pt> writes:
>> that shouldn't happen, in any case. If this is the current release
>> (7.1.2)
> The version that I'm using is 7.1release-3.potato.1
I don't see any problem here when I run your script. I suspect you are
seeing another consequence of the rewriter bug I fixed on 12-June.
Please update to 7.1.2 and apply the patch I posted then.
regards, tom lane