Sim, não está bem assim?

CREATE TRIGGER trg_postfire_study_area_UPDATE_dimensoes
    BEFORE INSERT OR UPDATE
    ON sch_forestal.postfire_study_area
    FOR EACH ROW
    EXECUTE PROCEDURE fun_dimensoes();


Eloi Ribeiro
GIS Analyst
39,45º -0,40º
flavors.me/eloiribeiro


No dia 20 de Março de 2012 15:09, Matheus de Oliveira <
[email protected]> escreveu:

> A trigger é BEFORE? Caso contrário não atualiza mesmo.
>
>
>
> --
> Matheus de Oliveira
>
> Bacharelado em Ciências de Computação
> Laboratório de Computação de Alto Desempenho - 
> LCAD<http://www.lcad.icmc.usp.br/>
> Instituto de Ciências Matemáticas e de Computação - 
> ICMC<http://www.icmc.usp.br/>
> Universidade de São Paulo - USP <http://www.sc.usp.br/>
>
>
>
>
> On Tue, Mar 20, 2012 at 10:57 AM, Eloi Ribeiro <[email protected]>wrote:
>
>> Obrigado a todos pelas vossas dicas.
>>
>> Fiz isso, retirei a parte de criação de colunas da função e agora não
>> salta nenhum erro.
>> No entanto seria de esperar que quando um polígono fosse editado o campo
>> área fosse actualizado e isso não acontece.
>>
>> Alguém me sabe dizer o que é que está mal?
>>
>>
>>
>> CREATE OR REPLACE FUNCTION fun_dimensoes()
>>   RETURNS trigger AS
>> $BODY$
>> DECLARE
>>     tipo    varchar(20);
>>     srid    integer;
>> BEGIN
>>     tipo     :=    (SELECT "type" FROM geometry_columns
>>             WHERE f_table_schema = TG_TABLE_SCHEMA
>>             AND f_table_name = TG_TABLE_NAME);
>>     srid     :=    (SELECT srid FROM geometry_columns
>>             WHERE f_table_schema = TG_TABLE_SCHEMA
>>             AND   f_table_name = TG_TABLE_NAME);
>>      -- ponto
>>     IF (tipo = 'POINT' OR tipo = 'MULTIPOINT') THEN
>>         NEW.x = ST_X(NEW.geom);
>>         NEW.y = ST_Y(NEW.geom);
>>     -- linha
>>     ELSIF (tipo = 'LINESTRING' OR tipo = 'MULTILINESTRING') THEN
>>
>>         IF (srid = 23030 OR srid = 25830) THEN
>>             NEW.longitude = ST_Length(NEW.geom)::bigint;
>>
>>         ELSIF (srid = 4326) THEN
>>             NEW.longitude = ST_Length(Geography(NEW.geom))::bigint;
>>         END IF;
>>     -- poligono
>>     ELSIF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
>>
>>         IF (srid = 23030 OR srid = 25830) THEN
>>             NEW.area = ST_Area(NEW.geom)::bigint;
>>             NEW.perimetro = ST_Perimeter(NEW.geom)::bigint;
>>
>>         ELSIF (srid = 4326) THEN
>>             NEW.area = ST_Area(Geography(NEW.geom))::bigint;
>>             NEW.perimetro = ST_Length(Geography(NEW.geom))::bigint;
>>         END IF;
>>     END IF;
>>
>> RETURN NEW;
>> END;
>> $BODY$
>>   LANGUAGE 'plpgsql' VOLATILE
>>   COST 100;
>>
>> Obrigado,
>>
>>
>> Eloi Ribeiro
>> GIS Analyst
>> 39,45º -0,40º
>> flavors.me/eloiribeiro
>>
>>
>> No dia 17 de Março de 2012 21:39, Matheus de Oliveira <
>> [email protected]> escreveu:
>>
>> Se você passar a trigger para AFTER ao invés de BEFORE suas chances de
>>> não ter lock "aumentam", mas não "desaparecem". Analisando por cima suas
>>> necessidades, não acredito que a melhor solução seja realmente adicionar
>>> uma coluna em uma trigger, isso me parece uma tarefa administrativa, ou
>>> seja, sempre adicione a coluna (talvez junto com a execução do comando
>>> CREATE TRIGGER) e na trigger simplesmente considere que ela já existe (pode
>>> até fazer a verificação e dar um RAISE EXCEPTION caso não exista).
>>>
>>> PS: Caso a trigger seja genérica para várias tabelas, você pode pensar
>>> em usar herança nessas tabelas para organizar melhor as coisas.
>>>
>>> Atenciosamente,
>>> --
>>> Matheus de Oliveira
>>>
>>> Bacharelado em Ciências de Computação
>>> Laboratório de Computação de Alto Desempenho - 
>>> LCAD<http://www.lcad.icmc.usp.br/>
>>> Instituto de Ciências Matemáticas e de Computação - 
>>> ICMC<http://www.icmc.usp.br/>
>>> Universidade de São Paulo - USP <http://www.sc.usp.br/>
>>>
>>>
>>>
>>>
>>>
>>> On Fri, Mar 16, 2012 at 10:07 AM, Eloi Ribeiro 
>>> <[email protected]>wrote:
>>>
>>>> O melhor será separar esta função em duas:
>>>> A primeira que verifique se os campos existem e se não os criam.
>>>> E a segunda como disparador para que se actualizem com os inserts e
>>>> updates.
>>>> Obrigado pela ajuda!
>>>>
>>>>
>>>> Eloi Ribeiro
>>>> GIS Analyst
>>>> 39,45º -0,40º
>>>> flavors.me/eloiribeiro
>>>>
>>>>
>>>> No dia 16 de Março de 2012 13:04, Flavio Henrique Araque Gurgel <
>>>> [email protected]> escreveu:
>>>>
>>>> > Cancelando as demais transações/conexões também resolve seu problema
>>>>> > *se, e somente se* isto não for um problema no seu cenário.
>>>>>
>>>>> Minha experiência com DDL dentro de funções é de resultado sempre
>>>>> inesperado.
>>>>> Se a função é específica para ser executada em horário controlado,
>>>>> geralmente é uma mão na roda. DBAs de madrugada sempre se dão melhor
>>>>> executando funções do que comandos mais complexos ou scripts.
>>>>> Já se a função é para ser chamada automaticamente por causa de uma
>>>>> necessidade de uma aplicação ou usuário, a chance de lock é
>>>>> monstruosa, e é o que está ocorrendo com o colega.
>>>>>
>>>>> []s
>>>>> Flavio Gurgel
>>>>> _______________________________________________
>>>>> pgbr-geral mailing list
>>>>> [email protected]
>>>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> pgbr-geral mailing list
>>>> [email protected]
>>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>>
>>>>
>>>
>>> _______________________________________________
>>> pgbr-geral mailing list
>>> [email protected]
>>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>>
>>>
>>
>> _______________________________________________
>> pgbr-geral mailing list
>> [email protected]
>> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>>
>>
>
> _______________________________________________
> pgbr-geral mailing list
> [email protected]
> https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral
>
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a