[firebase-br] Trigger After ou Before?

Zottis zottissistemas em brturbo.com.br
Sex Maio 29 12:55:49 -03 2009


De minha Parte, ja deu certo, muito obrigado a todos.


Principalmente ao Sandro.

Por isso é que esta lista é tão popular.
realmente tem bastante gente disposta a colaborar uns com os outros.



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
----- Original Message ----- 
From: "Sandro Souza" <escovadordebits em gmail.com>
To: "FireBase" <lista em firebase.com.br>; "bvrenato" <bvrenato em click21.com.br>
Sent: Friday, May 29, 2009 9:43 AM
Subject: Re: [firebase-br] Trigger After ou Before?


Bom dia/tarde BVRenato.

Grande BVRenato, se você desejar, poste aqui a DDL das tabelas envolvidas
com suas respectivas triggers e o código fonte dessa stored procedure que
está sendo chamada pela tal trigger.

Dessa forma, podemos te ajudar, e talvez também ajude ao nosso amigo Zottis,
que gerou esse tópico.

2009/5/29 bvrenato <bvrenato em click21.com.br>

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





Mais detalhes sobre a lista de discussão lista