[firebase-br] RES: Percorrer os campos de uma tabela em uma trigger
Ivan Guimarães Meirelles
igmeirelles em gmail.com
Sex Abr 24 17:06:00 -03 2009
Olá Sandro...
Obrigado pelo interesse...
Quanto ao uso de triggers não tenho duvida alguma...
Não quero percorrer todos os registros da tabela... quero percorrer todos os
campos de um registro alterado e verificar qual desses campos sofreram
alteração...
E registrar em uma outra tabela as alterações que ocorreram... por exemplo:
Registrar q o nome do cliente foi alterado de "ANTONIO DA SILVA" para
"ANTONIO CARLOS DA SILVA"
Porém... o usuário pode alterar mais de um campo no mesmo registro... por
isso desejo correr todos eles e registrar cada alteração.
Não sei se fui claro...
Atenciosamente, Ivan Meirelles.
-----Mensagem original-----
De: lista-bounces em firebase.com.br [mailto:lista-bounces em firebase.com.br] Em
nome de Sandro
Enviada em: sexta-feira, 24 de abril de 2009 15:55
Para: FireBase
Assunto: Re: [firebase-br] Percorrer os campos de uma tabela em uma trigger
Voce faz apenas a trigger before update para pegar o campo antigo e
atualizar na tabela nova.
Não tem o porque varrer a tabela toda, pois o registr modificado não tem
como fugir da trigger.
Se vc deu update nele, a trigger ja vai captar, não precisar ir atraz dos
outros registros, pois quandos eles foram modificados a trigger ja fez o
serviço dela naquele momento.
Entendeu?
Grato
----- 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
______________________________________________
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
__________ Informação do ESET Smart Security, versão da vacina 4034
(20090424) __________
A mensagem foi verificada pelo ESET Smart Security.
http://www.eset.com
__________ Informação do ESET Smart Security, versão da vacina 4034
(20090424) __________
A mensagem foi verificada pelo ESET Smart Security.
http://www.eset.com
Mais detalhes sobre a lista de discussão lista