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

PostgreSQL

22/05/2013

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

Curtidas 0

Respostas

Alisson Santos

Alisson Santos

22/05/2013

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.
GOSTEI 0
Luiz Junior

Luiz Junior

22/05/2013

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.
GOSTEI 0
Luiz Junior

Luiz Junior

22/05/2013

Subindo..
GOSTEI 0
Paulo Almeida

Paulo Almeida

22/05/2013

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
GOSTEI 0
Sávio Soares

Sávio Soares

22/05/2013

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

Marisiana Battistella

22/05/2013

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....
GOSTEI 0
Paulo Almeida

Paulo Almeida

22/05/2013

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
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

22/05/2013

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...
GOSTEI 0
Paulo Almeida

Paulo Almeida

22/05/2013

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
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

22/05/2013

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.
GOSTEI 0
Paulo Almeida

Paulo Almeida

22/05/2013

Verdade! Isso acontece bastante.

Paulo
GOSTEI 0
Marisiana Battistella

Marisiana Battistella

22/05/2013

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]
GOSTEI 0
Michel Simon

Michel Simon

22/05/2013

Prezado Paulo,

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

Michel Simon

22/05/2013

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();
GOSTEI 0
Michel Simon

Michel Simon

22/05/2013

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();
GOSTEI 0
POSTAR