Trigger - Copiar dados apos inserção para outra tabela

22/05/2013

0

Prezado amigo, estou precisando criar uma trigger que após inserir um registro em uma tabela ela insira os mesmo dados em outra tabela, estou sem idéias de como fazer isto.
Luiz Junior

Luiz Junior

Responder

Posts

22/05/2013

Alisson Santos

Bom referente a isso, seria legal você informar para nós quais os possiveis campos.
Isso que falou é possivel sim, mais tem que verificar a estrutura das tabelas para ver qual a melhor maneira de ser feito.
Responder

22/05/2013

Luiz Junior

Então Alisson é muito simples
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.
Responder

03/06/2013

Luiz Junior

Subindo..
Responder

16/08/2013

Paulo Almeida

Também tenho interesse, igual ao colega. E também no caso de updade. Caso mudar algum dos campos , alterar também na outra tabela.
É possível ?

Paulo
Responder

16/02/2014

Sávio Soares

Tem sido o motivo de muitos pensamentos meus nos últimos dias tentar resolver isso, mas até agora sem solução.
Responder

17/02/2014

Marisiana Battistella

Olá pessoal!
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....
Responder

17/02/2014

Paulo Almeida

Eu fiz aqui e deu certo.

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
Responder

17/02/2014

Marisiana Battistella

Também tinha pensado nessa mesma solução que Paulo compartilhou.
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...
Responder

17/02/2014

Paulo Almeida

Todos os procedimentos ,trigger, funçoes etc... devem ser comentados no código fonte e se possível documentado.

Para que a pessoa que um dia for fazer alguma manutenção, antes disso leia e tenha um conhecimento do que já feito.

Paulo
Responder

17/02/2014

Marisiana Battistella

Se todos fizerem isso funciona!
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.
Responder

17/02/2014

Paulo Almeida

Verdade! Isso acontece bastante.

Paulo
Responder

17/02/2014

Marisiana Battistella

Só para agregar à conversa, encontrei algumas boa práticas com relação ao uso de triggers:

* 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]
Responder

03/12/2015

Michel Simon

Prezado Paulo,

Estou enfrentando a mesma dificuldade, saberia se é possível disponibilizar o restante do código? Grato
Responder

03/12/2015

Michel Simon

Finalizei o desenvolvimento da Trigger para a solução proposta.


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();
Responder

03/12/2015

Michel Simon

Finalizei o desenvolvimento da Trigger para a solução proposta.


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();
Responder

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

Aceitar