[firebase-br] Trigger After ou Before?

Sandro Souza escovadordebits em gmail.com
Qui Maio 28 14:51:10 -03 2009


Bom dia/tarde Zottis.

Grande Zottis, vamos por partes:

1 - After ou Before update?

Depende da situação.

Se você deseja validar os novos dados (com prefixo NEW) para que só sejam
salvos valores coerentes/válidos, então coloque no momento anterior
(BEFORE).

Se você deseja executar algum recálculo ou outro tipo de ação, nessa mesma
tabela, quando há alguma alteração nessa tabela, então coloque no momento
anterior (BEFORE).

Se você deseja executar algum recálculo ou outro tipo de ação, em outras
tabelas, quando há alguma alteração nessa tabela, então coloque no momento
posterior (AFTER).

2 - Usar o prefixo NEW ou OLD?

Também depende da situação.

Se você deseja validar os novos valores, antes que sejam salvos, e até
alterá-los, então utilize o prefixo NEW.

Se você deseja acessar os valores anteriores (para validação), então utilize
o prefixo OLD.

Corrija-me se eu estiver enganado, mas pelo seu código, dá a impressão que a
tabela FAT_MTR é uma tabela detalhe da tabela CLIENTES, e se for, acredito
que você esteja criando essa trigger justamente para atualizar alguns campos
chaves quando há qualquer alteração no campo chave da tabela de clientes.

Se for isso mesmo, então não há necessidade de criar uma ou mais triggers
para isso, basta apenas informar nas respectivas chaves estrangeiras que
esses mesmos valores chaves devem ser atualizados em cascata, ou seja,
acrescentando a cláusula ON UPDATE (na atualização) com a opção CASCADE (em
cascata), e isso já ocorreria automaticamente.

Caso as respectivas chaves estrangeiras não tenham sido criadas com essa
cláusula (ON UPDATE CASCADE), então você deve removê-las e recriá-las dessa
forma. Digo até que isso seria essencial se existe essa possibilidade de
alterar os valores chaves. Dessa forma, tudo fica sincronizado
automaticamente com o mínimo de esforço.

Por incrível que pareça, o grande Oracle não tem esse recurso, no caso dele,
tem que apelar para uma trigger anterior (para desativar as possíveis chaves
estrangeiras das tabelas detalhes para essa tabela) e outra trigger
posterior (para reativar essas possíveis chaves estrangeiras).

Espero ter ajudado mais que atrapalhado. :D

2009/5/28 Zottis <zottissistemas em brturbo.com.br>

> Pessoal, tenho a procedure
>
> CREATE PROCEDURE SP_ARRUMA_FAR_COD_MASTER (
>    Cod_cliente INTEGER,
>    Cod_master INTEGER)
> AS
> begin
>  UPDATE Far_mtr F
>  SET F.Cod_master = :Cod_master
>  WHERE F.Cod_cliente = :Cod_cliente;
> end^
>
> que preciso disparar com o gatilho
>
> CREATE TRIGGER TG_CLIENTES_ALTERA_COD_MASTER FOR CLIENTES
> ACTIVE AFTER UPDATE POSITION 0
> AS
> begin
>     execute procedure
> Sp_arruma_far_cod_master(Old.Cod_CLIENTE,Old.Cod_MASTER);
> end
> ^
>
> mas a dúvida é a seguinte devo colocar After update ou before update e é
> (Old.Cod_CLIENTE,Old.Cod_MASTER) ou (New.Cod_CLIENTE,New.Cod_MASTER)
>
> desde já agradeço
>
> uso FB 2.1 D7 e MDO
>
>
> Zottis(TeamFB Users)
>
> Zottis Sistemas - 2009 Ano XII
> Programação Delphi/PHP/Firebird/MySQL
>
> "Um homem só tem o direito de olhar
>  a um outro de cima para baixo, quando
>  vai ajuda-lo a levantar-se".
>                   Gabriel Garcia Marquez
> ______________________________________________
> FireBase-BR (www.firebase.com.br) - Hospedado em www.locador.com.br
> Para saber como gerenciar/excluir seu cadastro na lista, use:
> http://www.firebase.com.br/fb/artigo.php?id=1107
> Para consultar mensagens antigas: http://firebase.com.br/pesquisa
>



Mais detalhes sobre a lista de discussão lista