[firebase-br] Percorrer os campos de uma tabela em uma trigger

Kelver Merlotti kmerlotti em gmail.com
Dom Abr 26 12:43:41 -03 2009


A questão é como fazer esse if com cada campo da tabela, sem saber
quais e quantos campos são.
Abraços!

2009/4/24 Magno System <magno em speet.com.br>:
> Faça uma trigger after insert assim:
>
> IF NEW.CAMPO <> OLD.CAMPO THEN
>  INSERT INTO TABELALOG(VALORATUAL, VALORANTIGO) VALUES (NEW.CAMPO,
> OLD.CAMPO)
>
> Dessa forma não há necessidade de se percorrer a tabela, pois a inserção
> acontecerá no momento da alteração.
>
> ----- Original Message ----- From: "Ivan Guimarães Meirelles"
> <igmeirelles em gmail.com>
> To: "'FireBase'" <lista em firebase.com.br>
> Sent: Friday, April 24, 2009 3:29 PM
> Subject: [firebase-br] Percorrer os campos de uma tabela em uma trigger
>
>
> Olá caros colegas "Firebirdianos"...
>
>
>
> Eu preciso criar uma trigger que percorra todos os campos da tabela e faça
> uma comparação entre o valor novo (new) e o valor anterior (old) a fim de
> registrar em outra tabela as mudanças que ocorreram, quando o usuário
> executar um update na tabela.
>
>
>
> Eu criei uma SP onde passo o nome da tabela como parâmetro e a SP me retorna
> todos os campos.
>
> O código da SP está abaixo e funcionando perfeitamente:
>
>
>
> -- ***************************************************************
>
> CREATE PROCEDURE LISTA_CAMPOS_TABELA (tabela varchar(93))
>
> returns (campo varchar(93))
>
> as begin
>
>   for select
>
>       c.rdb$field_name
>
>       from rdb$relation_fields c
>
>       where lower(c.rdb$relation_name) = lower(:tabela)
>
>       order by 1
>
>   into
>
>       :campo
>
>   do
>
>       suspend;
>
> end
>
> -- ***************************************************************
>
>
>
> Então eu tentei fazer uma trigger da seguinte maneira:
>
>
>
> -- ***************************************************************
>
> CREATE TRIGGER TRIGGER_TESTE FOR TABELA_TESTE
>
> ACTIVE BEFORE UPDATE POSITION 0
>
> AS
>
> declare variable campo varchar(93);
>
> begin
>
>   for select c.campo from lista_campos_tabela('tabela_teste') c
>
>       into :campo
>
>   do begin
>
>               -- > aqui eu preciso pegar o valor anterior e o novo ...
> porém o nome do campo está em :campo
>
>               -- > não sei como proceder.
>
>   end
>
> end
>
>
>
>
>
> -- ***************************************************************
>
>
>
> Alguém poderia me dar uma idéia ?? estou utilizando Firebird 2.1
>
>
>
> Desde já agradeço a atenção dispensada.
>
> ______________________________________________
> 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
>
>
> --------------------------------------------------------------------------------
>
>
>
> No virus found in this incoming message.
> Checked by AVG - www.avg.com
> Version: 8.0.238 / Virus Database: 270.12.4/2078 - Release Date: 04/24/09
> 07:54:00
>
>
> ______________________________________________
> 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
>



-- 
Kelver Merlotti
Coordenador Editorial do Portal www.ActiveDelphi.com.br
Contato: kelver em activedelphi.com.br
Google: kmerlotti em gmail.com
Msn: kmerlotti em hotmail.com
Tem um segundo? Então, dá uma olhadinha nisso:
Um site de publicidades, de Portugal, está pagando em euros (quase 3x
mais que em reais) pra quem estiver disposto a:
 * Ler anúncios
 * Visitar sites
 * Clicar em banners
 * Navegar na NET
 * Ler e-mails
 * Convidar novos usuários
O pagamento é feito em cheque! Registra lá!! Não custa nada! ;-)
http://www.publipt.com/pages/index.php?refid=kmerlotti




Mais detalhes sobre a lista de discussão lista