Melhorias

<< Click to Display Table of Contents >>

Navigation:  PostgreSQL > Postgre 9.0 >

Melhorias

Previous pageReturn to chapter overviewNext page

Triggers / Execução de função


Triggers / Execução de função

O postgre 9.0 ficou mais inteligente na execução das funções, ao fazer uma trigger de multiplos eventos (insert/update/delete) deve ser tomado cuidado com a seguinte situação abaixo, que funciona no 9.0 mas não no 8.3.

Imagine o seguinte trecho numa trigger de before insert e update:

 

if (tg_op = 'UPDATE') and (new.campo is not nulland (old.campo is nullthen

...

end if;

 

 

O interpretador do 8.3 é burro e irá dar erro na linha acima quando for uma operação de insert, isto porque ao constatar que a operação "(tg_op = 'UPDATE')" é "false", ele continuará analisando o resto das operações da linha desnecessariamente e ao deparar-se com "(old.campo is null)" irá ocorrer o seguinte erro devido a falta do registro "old" por ser uma operação de insert.

 

ERROR:  record "old" is not assigned yet

DETAIL:  The tuple structure of a not-yet-assigned record is indeterminate.

CONTEXT:  PL/pgSQL function "fn_tb_balanco_biu" line 9 at IF

 

Logo o comando deverá ser quebrado em blocos para que funcione, ficando da seguinte maneira:

 

if (tg_op = 'UPDATE') then

if (new.campo is not nulland (old.campo is nullthen

...

end if;

end if;

 

 

No Postgre 9.0 não seria necessário separar em 2 blocos a comparação, pois ao encontrar a primeira condição que mataria a entrada do "if", ele para de analisar o resto (Como é feito nas linguagens que estamos acostumados), mas como nossos clientes ainda usam 8.3.... tomem cuidado.