Ajuda em Trigger - Campos Dinamicos para passar no OLD E NEW
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; !
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
Curtidas 0
Respostas
Claudia Nogueira
12/12/2012
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.
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.
GOSTEI 0
Timuio
12/12/2012
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
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
GOSTEI 0
Claudia Nogueira
12/12/2012
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.
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.
GOSTEI 0
Timuio
12/12/2012
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.
Vou tentar de outra maneira, pois acho muito trabalhoso criar para cada campo.
GOSTEI 0