[firebase-br] Trigger After ou Before?

bvrenato bvrenato em click21.com.br
Sex Maio 29 03:02:45 -03 2009


Eu estou com um problema envolvendo esta questão:
Após inserir um item de pedido eu disparo uma trigger(after insert or update or
delete) que executa uma procedure que recalcula os valores de venda para cada
item caso a quantidade de itens total do pedido tenha atingido um determinado
valor.

Só que dentro da procedure, como faço um update em cada item para atualizar o
valor recalculado está dando um erro de recursividade (entre a trigger e a
procedure) pois qdo a procedure faz o update, dispara novamente a trigger.

Já coloquei after e também before... mas não resolveu. }:(


Renato






Citando Sandro Souza <escovadordebits em gmail.com>:

> 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
> >
> ______________________________________________
> 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
>



___________________________________________________________________________________
Para fazer uma ligação DDD pra perto ou pra longe, faz um 21. A Embratel tem
tarifas muito baratas esperando por você. Aproveite!





Mais detalhes sobre a lista de discussão lista