Fórum Ajuda em Trigger - Campos Dinamicos para passar no OLD E NEW #430903

12/12/2012

0

Boa tarde, estou com dificuldades de criar uma Trigger "Dinâmica" conforme o exemplo a seguir:


SET TERM !;

CREATE TRIGGER LOOP_ADD_REGISTROS FOR TABELA
ACTIVE AFTER INSERT POSITION 32767
AS
DECLARE VARIABLE NOMECAMPO VARCHAR(15);
BEGIN

FOR SELECT f.rdb$field_name -- Select para retornar todos os campos da tabela
FROM rdb$relation_fields f
JOIN rdb$relations r on f.rdb$relation_name = r.rdb$relation_name
AND r.rdb$view_blr is null
AND (r.rdb$system_flag is null or r.rdb$system_flag = 0)
WHERE f.rdb$relation_name = ''TABELA''
INTO :NOMECAMPO
DO
BEGIN
IF ( ( NEW.?????? ) IS NOT NULL ) THEN -- Aqui gostaria de passar o valor do campo que esta posicionado a trigger, mas o campo que está na variável :NOMECAMPO.
EXECUTE PROCEDURE P_INSERT_REGISTROS( ''TABELA'', :NOMECAMPO, NEW.?????? );
END
END;

SET TERM; !
Timuio

Timuio

Responder

Posts

12/12/2012

Claudia Nogueira

Não entendi direito.
Esse ''TABELA'' seria um parâmetro externo?
Não tem como passar um parâmetro externo pra um trigger que eu saiba.

O que dá pra fazer é em cada trigger de cada tabela que é executado depois do INSERT, UPDATE ou DELETE chamar a procedure passando os parâmetros.

Vamos ver se mais alguém tem alguma ideia.
Responder

Gostei + 0

12/12/2012

Timuio

Não a TABELA é a tabela em si, só utilizei ela como exemplo, no caso iria criar uma trigger para cada tabela.

create table PESSOAS(
ID
NOME
IDADE
);

Só que na trigger criada ao inves de passar os campos

dentro do

BEGIN
IF ( ( NEW.ID ) IS NOT NULL ) THEN
EXECUTE PROCEDURE P_INSERT_REGISTROS( 'PESSOAS', 'ID', NEW.ID );
END

gostaria de passar o campo que está salvo na variavel :NOMECAMPO retornado do FOR SELECT dos campos.

BEGIN
IF ( ( NEW.:NOMECAMPO ) IS NOT NULL ) THEN
EXECUTE PROCEDURE P_INSERT_REGISTROS( 'PESSOAS', :NOMECAMPO, NEW.:NOMECAMPO );
END

Só que não consigo ter valores para estas variáveis de transições( NEW.????? ou OLD.????? ) com o campo que está em :NOMECAMPO
Responder

Gostei + 0

12/12/2012

Claudia Nogueira

Entendi, você quer fazer tipo uma auditoria/log, mas não quer passar campo por campo no trigger.
Isso muitos que trabalham com Firebird gostariam de fazer, porém não dá, pelo menos eu nunca consegui.
Tem que passar campo por campo mesmo, NEW.ID, NEW.NOME e etc.
Responder

Gostei + 0

13/12/2012

Timuio

Isto, a ideia era esta, obrigado pelas respostas assim não fico apenas achando que estava codificando errado.
Vou tentar de outra maneira, pois acho muito trabalhoso criar para cada campo.
Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar