Trigger - Copiar dados apos inserção para outra tabela
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
Curtidas 0
Respostas
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.
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
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.
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
22/05/2013
Subindo..
GOSTEI 0
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
É possível ?
Paulo
GOSTEI 0
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
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....
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
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
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
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...
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
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
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
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.
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
22/05/2013
Verdade! Isso acontece bastante.
Paulo
Paulo
GOSTEI 0
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]
* 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
22/05/2013
Prezado Paulo,
Estou enfrentando a mesma dificuldade, saberia se é possível disponibilizar o restante do código? Grato
Estou enfrentando a mesma dificuldade, saberia se é possível disponibilizar o restante do código? Grato
GOSTEI 0
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();
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
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();
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