[Portugal] trigger que actualize apenas registos novos

Pedro Costa pedrocostaarma sapo.pt
Segunda-Feira, 14 de Novembro de 2011 - 08:19:06 EST


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
> 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/94aee241/attachment-0001.html


Mais informações acerca da lista Portugal