[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