[Portugal] trigger que actualize apenas registos novos

Pedro Costa pedrocostaarma sapo.pt
Segunda-Feira, 14 de Novembro de 2011 - 09:09:22 EST


Ele está after insert e funciona, muito obrigado.
só é pena o bug do qgis

Com os melhores cumprimentos,

Pedro Costa
Geógrafo
Especializado em Sistemas de Informação Geográfica e Ordenamento do Território



Em 14-11-2011 13:54, Jorge Penedo escreveu:
> a indicação new é valida para todos os campos da tabela
> o prefixo new, e refrente ao novo valor atribuido ao campo
> o old, é o valor que estava anteriormente.
> se tem uma chave que é gerada de forma automática, sugiro que o 
> trigger seja after insert
>
>
> No dia 14 de Novembro de 2011 13:19, Pedro Costa 
> <pedrocostaarma  sapo.pt <mailto:pedrocostaarma  sapo.pt>> escreveu:
>
>     Caro Jorge é obrigatório na função o campo new ser o id?Pode ser
>     outro?
>     É que assim sempre que insiro um registo novo a tabela do qgis
>     fica com tudo a null...é um bug...
>
>     Obrigado
>
>     Com os melhores cumprimentos,
>
>     Pedro Costa
>     Geógrafo
>     Especializado em Sistemas de Informação Geográfica e Ordenamento do Território
>
>
>
>     Em 14-11-2011 12:07, Jorge Penedo escreveu:
>>     Creio que deve existir uma chave primária na tabela elementos,
>>     para o caso consideremos como ID
>>     ficaria algo do genero
>>
>>     CREATE OR REPLACE FUNCTION insert_elementos()
>>
>>     RETURNS trigger AS
>>
>>     $BODY$
>>
>>     begin
>>
>>     UPDATE elementos SET n_rua = (SELECT n_rua FROM ruas ORDER BY
>>     ST_Distance(ruas.the_geom, elementos.the_geom) ASC LIMIT 1)
>>     where id = new.id <http://new.id/>;
>>     return NULL;
>>
>>     end
>>
>>     $BODY$
>>
>>     LANGUAGE 'plpgsql' VOLATILE
>>
>>     COST 100;
>>
>>     ALTER FUNCTION insert_elementos() OWNER TO postgres;
>>
>>     CREATE TRIGGER altera_tabela
>>
>>     AFTER INSERT
>>
>>     ON elementos
>>
>>     FOR EACH ROW
>>
>>     EXECUTE PROCEDURE insert_elementos();
>>
>>     neste exemplo o utilizador da base de dados é o "postgres". o que
>>     deverá ser substituido pelo ower da tabela
>>     se for esse o caso
>>
>>     No dia 14 de Novembro de 2011 11:50, Pedro Costa
>>     <pedrocostaarma  sapo.pt <mailto:pedrocostaarma  sapo.pt>> escreveu:
>>
>>         Jorge,
>>
>>         Obrigado por ajudar.
>>
>>         Eu quero que sempre que insiramos novos registos na tabela
>>         elementos este update dispare:
>>
>>         UPDATE elementos SET n_rua = (SELECT n_rua FROM ruas ORDER BY
>>         ST_Distance(ruas.the_geom, elementos.the_geom) ASC LIMIT 1)
>>
>>         O update é sobre a mesma tabela. Como formulo a função?
>>
>>         obrigado
>>
>>         Com os melhores cumprimentos,
>>
>>         Pedro Costa
>>         Geógrafo
>>         Especializado em Sistemas de Informação Geográfica e Ordenamento do Território
>>
>>
>>
>>         Em 14-11-2011 11:46, Jorge Penedo escreveu:
>>>
>>>
>>>         No dia 14 de Novembro de 2011 11:44, Jorge Penedo
>>>         <jorge.penedo  gmail.com <mailto:jorge.penedo  gmail.com>>
>>>         escreveu:
>>>
>>>             O after / acção só é disparado após  a ocurrência. Por
>>>             exemplo ao inserir numa tabela, o trigger só dispara
>>>             depois dos dados estarem armazenados.
>>>             Já no before, o trigger dispara antes dos dados
>>>             estarem guardados.
>>>             Se percebi quer fazer um insert numa tabela, e aos
>>>             regsitos novos pretende fazer uma actualização noutra
>>>             tabela é isso?
>>>             por exemplo, se tiver uma tabela de nome testes, e
>>>             sempre que ocorra uma inserção  quer
>>>             que essa mesma informação seja inserida na tabela trecebe.
>>>             deve criar uma função para trigger, do género;
>>>             "
>>>
>>>             CREATE OR REPLACE FUNCTION insert_testes()
>>>
>>>             RETURNS trigger AS
>>>
>>>             $BODY$
>>>
>>>             begin
>>>
>>>             insert into trecebe (id_novo,nome)
>>>
>>>             values (new.id <http://new.id/>, new.nome);
>>>
>>>             delete from testes where id = new.id <http://new.id/>;
>>>
>>>             return NULL;
>>>
>>>             end
>>>
>>>             $BODY$
>>>
>>>             LANGUAGE 'plpgsql' VOLATILE
>>>
>>>             COST 100;
>>>
>>>             ALTER FUNCTION insert_testes() OWNER TO postgres;
>>>
>>>              "
>>>
>>>             e um trigger do tipo:
>>>
>>>             "
>>>
>>>             CREATE TRIGGER altera_tabela
>>>
>>>             AFTER INSERT
>>>
>>>             ON testes
>>>
>>>             FOR EACH ROW
>>>
>>>             EXECUTE PROCEDURE insert_testes();
>>>
>>>             "
>>>             Notas: na função existe o prefixo new que se refer aos
>>>             valores inseridos.
>>>             Caso fosse uma acção em tivesse alterado dados ( update
>>>             ou delete) teria a possibilidade
>>>             de gerir os novos valores "new" e oa antigos "old".
>>>             Para criar estas funções e trigger pode recorrer ao
>>>             pgadmin, onde é um pouco mais intuitivo.
>>>             Agora se pretende inserir um registo e fazer um update
>>>             de seguida, ao mesmo registo, das duas uma
>>>             ou ao fazer o insert insere logo os dados na totalidade,
>>>             ou na função do trigger inclui as
>>>             clausulas de actualização.
>>>             exemplo de update:
>>>
>>>              update tabela set campo = novo_valor where id = new.id
>>>             <http://new.id/>
>>>
>>>
>>>
>>>             No dia 14 de Novembro de 2011 11:28, Pedro Costa
>>>             <pedrocostaarma  sapo.pt <mailto:pedrocostaarma  sapo.pt>>
>>>             escreveu:
>>>
>>>                 postgres, então para actualizar apenas os novos
>>>                 tenho de utilizar o update e o before?
>>>
>>>                 Obrigado pela ajuda
>>>
>>>                 Com os melhores cumprimentos,
>>>
>>>                 Pedro Costa
>>>                 Geógrafo
>>>                 Especializado em Sistemas de Informação Geográfica e Ordenamento do Território
>>>
>>>
>>>
>>>                 Em 14-11-2011 11:18, Jorge Penedo escreveu:
>>>>                 Quando se define um trigger  é indicado o evento 
>>>>                 after/before insert/delete/update
>>>>                 o que pretende é algo do tipo
>>>>                 after insert ou before insert
>>>>                 onde é possível detectar todos os registo novos,
>>>>                 inseridos numa tabela
>>>>                 como não me indicou se está a trabalhar com
>>>>                 sqlserver, postgres, oracle ou outro SGBD não poderei
>>>>                 ser mais especifico.
>>>>                 Qual o SGBD  que está  a usar?
>>>>                 Cumprimentos
>>>>                 Jorge Penedo
>>>>
>>>>
>>>>                 No dia 14 de Novembro de 2011 11:05, Pedro Costa
>>>>                 <pedrocostaarma  sapo.pt
>>>>                 <mailto:pedrocostaarma  sapo.pt>> escreveu:
>>>>
>>>>                     Pessoal alguém podia ajudar a formular um
>>>>                     trigger que dispare quando inserimos novos
>>>>                     registos numa tabela?
>>>>                     Queria que executasse um update mas apenas nos
>>>>                     registos novos inseridos no momento, não em todos.
>>>>                     Alguém pode ajudar?
>>>>
>>>>                     Obrigado
>>>>
>>>>                     -- 
>>>>                     Com os melhores cumprimentos,
>>>>
>>>>                     Pedro Costa
>>>>
>>>>
>>>>                     _______________________________________________
>>>>                     Portugal mailing list
>>>>                     Portugal  lists.osgeo.org
>>>>                     <mailto:Portugal  lists.osgeo.org>
>>>>                     http://lists.osgeo.org/mailman/listinfo/portugal
>>>>
>>>>
>>>>
>>>>
>>>>                 _______________________________________________
>>>>                 Portugal mailing list
>>>>                 Portugal  lists.osgeo.org  <mailto:Portugal  lists.osgeo.org>
>>>>                 http://lists.osgeo.org/mailman/listinfo/portugal
>>>
>>>                 _______________________________________________
>>>                 Portugal mailing list
>>>                 Portugal  lists.osgeo.org
>>>                 <mailto:Portugal  lists.osgeo.org>
>>>                 http://lists.osgeo.org/mailman/listinfo/portugal
>>>
>>>
>>>
>>>
>>>
>>>         _______________________________________________
>>>         Portugal mailing list
>>>         Portugal  lists.osgeo.org  <mailto:Portugal  lists.osgeo.org>
>>>         http://lists.osgeo.org/mailman/listinfo/portugal
>>
>>         _______________________________________________
>>         Portugal mailing list
>>         Portugal  lists.osgeo.org <mailto:Portugal  lists.osgeo.org>
>>         http://lists.osgeo.org/mailman/listinfo/portugal
>>
>>
>>
>>
>>     _______________________________________________
>>     Portugal mailing list
>>     Portugal  lists.osgeo.org  <mailto:Portugal  lists.osgeo.org>
>>     http://lists.osgeo.org/mailman/listinfo/portugal
>
>     _______________________________________________
>     Portugal mailing list
>     Portugal  lists.osgeo.org <mailto:Portugal  lists.osgeo.org>
>     http://lists.osgeo.org/mailman/listinfo/portugal
>
>
>
>
> _______________________________________________
> Portugal mailing list
> Portugal  lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/portugal
-------------- próxima parte ----------
Um anexo em HTML foi limpo...
URL: http://lists.osgeo.org/pipermail/portugal/attachments/20111114/e10df09b/attachment-0001.html


Mais informações acerca da lista Portugal