[Portugal] trigger que actualize apenas registos novos

Jorge Penedo jorge.penedo gmail.com
Segunda-Feira, 14 de Novembro de 2011 - 07:07:41 EST


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;

            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>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>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, new.nome);
>>
>>             delete from testes where id = 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
>>
>
>
>>
>>
>>
>>
>> No dia 14 de Novembro de 2011 11:28, Pedro Costa <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
>>> > 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
>>>> http://lists.osgeo.org/mailman/listinfo/portugal
>>>>
>>>
>>>
>>>
>>> _______________________________________________
>>> Portugal mailing listPortugal  lists.osgeo.orghttp://lists.osgeo.org/mailman/listinfo/portugal
>>>
>>>
>>> _______________________________________________
>>> Portugal mailing list
>>> Portugal  lists.osgeo.org
>>> http://lists.osgeo.org/mailman/listinfo/portugal
>>>
>>>
>>
>
>
> _______________________________________________
> Portugal mailing listPortugal  lists.osgeo.orghttp://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/4faa9537/attachment.html


Mais informações acerca da lista Portugal