Trigger - Copiar dados apos inserção para outra tabela
22/05/2013
0
Luiz Junior
Posts
22/05/2013
Alisson Santos
Isso que falou é possivel sim, mais tem que verificar a estrutura das tabelas para ver qual a melhor maneira de ser feito.
22/05/2013
Luiz Junior
tenho uma tabela contas_pagar(id_contas_pagar, data_emissao, id_plano_contas, valor)
o que eu quero é que após eu inserir um registro nesta tabela, acione uma trigger que insira na tabela balancete(id_balancete, id_contas_pagar, id_plano_contas,data, valor,)o registro que foi inserido.
16/08/2013
Paulo Almeida
É possível ?
Paulo
16/02/2014
Sávio Soares
17/02/2014
Marisiana Battistella
Não seria mais fácil criar um procedimento que insira os dados na primeira tabela e em seguida na segunda tabela?
Acredito que fica mais fácil de controlar no caso de ocorrer um erro de inserção na primeira ou na segunda tabela...
Pode utilizar e os tratamentos de exceções....
17/02/2014
Paulo Almeida
Segue parte do código....
primeiro cria a função:
"CREATE OR REPLACE FUNCTION Adiciona_campos_novos_prod_para_rotapl() "+CRLF;
+"RETURNS trigger AS"+CRLF;
+"$BODY$ BEGIN"+CRLF;
+"IF (TG_OP = 'INSERT') THEN "+CRLF;
+"IF new.tipo_for = '1' THEN "+CRLF;
+" INSERT INTO rotapl(codfil, codprod, digito, codrota, rotapr, p_grupo, codgrupo, hcoleta, ativo, codext)"+CRLF;
+" VALUES (new.codfil, new.codprod, new.digito, new.codrota, 'S', new.p_grupo, new.codgrupo, new.hcoleta, new.ativo, new.codext );"+CRLF;
+"END IF ;"+CRLF;
+"END IF ;"+CRLF;
........
depois a trigger
CREATE TRIGGER Adiciona_campos_novos_prod_para_rotapl"+CRLF;
+"AFTER INSERT OR DELETE OR UPDATE OF codrota, codgrupo, p_grupo, hcoleta, ativo "+CRLF;
+"ON produtor"+CRLF;
+"FOR EACH ROW"+CRLF;
+"EXECUTE PROCEDURE Adiciona_campos_novos_prod_para_rotapl() ",.t.,.f.)
Paulo
17/02/2014
Marisiana Battistella
Mas, sempre tem um porém com relação ao uso de trigger, pois como ela executa independente (não é chamada em nenhum código),
uma pessoa que desconheça o sistema e for realizar alguma manutenção poderá ter dificuldades para entender o processo...
E se for uma manutenção de emergência acaba gerando atrasos.
Conheço DBAs não recomendam o uso de triggers em casos que podem ser resolvidos utilizando procedimentos...
17/02/2014
Paulo Almeida
Para que a pessoa que um dia for fazer alguma manutenção, antes disso leia e tenha um conhecimento do que já feito.
Paulo
17/02/2014
Marisiana Battistella
Mas sempre tem alguém faz alterações e não comenta ou simplesmente deixa de fazer...
Não quis desfazer da tua idéia Paulo, tanto que mencionei q também pensei nessa solução.
O comentário que fiz foi relacionado a uma realidade que já vivenciei.
17/02/2014
Marisiana Battistella
* Utilize TRIGGER somente quando necessário;
* Quando for utilizar, que ele seja o mais simples possível;
* TRIGGERS não tem um bom suporte a muitas transações;
* Dependendo de como forem definidas, podem originar problemas com performances;
* Minimize o quanto puder instruções ROLLBACK em TRIGGERS;
Fonte: [url]https://www.devmedia.com.br/introducao-a-triggers/1695[/url]
Nesta matéria tem mais algumas informações: [url]http://imasters.com.br/artigo/14335/desenvolvimento/boas-praticas-de-programacao-em-pl-sql--parte-02/[/url]
03/12/2015
Michel Simon
Estou enfrentando a mesma dificuldade, saberia se é possível disponibilizar o restante do código? Grato
03/12/2015
Michel Simon
CREATE OR REPLACE FUNCTION fn_replica_areas_priorizadas() RETURNS TRIGGER
AS $tg_replica_areas_priorizadas$
BEGIN
IF (TG_OP = 'DELETE') THEN
DELETE FROM fca_prior WHERE
"Projeto" = OLD."Projeto"
or "Ano" = OLD."Ano"
and "Processo" = OLD."Processo"
and "geom" = OLD."geom";
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
UPDATE fca_prior set "Projeto" = NEW."Projeto"
,"Ano" = NEW."Ano"
,"Processo" = NEW."Processo"
,"geom" = NEW."geom"
WHERE
"Projeto" = OLD."Projeto"
or "Ano" = OLD."Ano"
and "Processo" = OLD."Processo"
and "geom" = OLD."geom";
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
--INSERT INTO fca_prior SELECT NEW.*;
INSERT INTO fca_prior ("Projeto","Ano","Processo","geom")
values (NEW."Projeto",NEW."Ano",NEW."Processo",NEW."geom");
RETURN NEW;
END IF;
RETURN NULL;
END;
$tg_replica_areas_priorizadas$ language plpgsql;
CREATE TRIGGER tg_replica_areas_priorizadas
AFTER INSERT OR UPDATE OR DELETE ON "Licenciamento"."FCA_Areas_Priorizadas"
FOR EACH ROW EXECUTE PROCEDURE fn_replica_areas_priorizadas();
03/12/2015
Michel Simon
CREATE OR REPLACE FUNCTION fn_replica_areas_priorizadas() RETURNS TRIGGER
AS $tg_replica_areas_priorizadas$
BEGIN
IF (TG_OP = 'DELETE') THEN
DELETE FROM fca_prior WHERE
"Projeto" = OLD."Projeto"
or "Ano" = OLD."Ano"
and "Processo" = OLD."Processo"
and "geom" = OLD."geom";
RETURN OLD;
ELSIF (TG_OP = 'UPDATE') THEN
UPDATE fca_prior set "Projeto" = NEW."Projeto"
,"Ano" = NEW."Ano"
,"Processo" = NEW."Processo"
,"geom" = NEW."geom"
WHERE
"Projeto" = OLD."Projeto"
or "Ano" = OLD."Ano"
and "Processo" = OLD."Processo"
and "geom" = OLD."geom";
RETURN NEW;
ELSIF (TG_OP = 'INSERT') THEN
--INSERT INTO fca_prior SELECT NEW.*;
INSERT INTO fca_prior ("Projeto","Ano","Processo","geom")
values (NEW."Projeto",NEW."Ano",NEW."Processo",NEW."geom");
RETURN NEW;
END IF;
RETURN NULL;
END;
$tg_replica_areas_priorizadas$ language plpgsql;
CREATE TRIGGER tg_replica_areas_priorizadas
AFTER INSERT OR UPDATE OR DELETE ON "Licenciamento"."FCA_Areas_Priorizadas"
FOR EACH ROW EXECUTE PROCEDURE fn_replica_areas_priorizadas();
Clique aqui para fazer login e interagir na Comunidade :)