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