Bem, já consegui alguns progressos com a função.
No entanto tenho o seguinte erro:

ERROR:  no se puede hacer ALTER TABLE en «postfire_study_area» porque está
siendo usada por consultas activas en esta sesión
CONTEXTO:  sentencia SQL: «ALTER TABLE sch_forestal.postfire_study_area ADD
COLUMN area bigint»

Fiz as seguintes alterações:



> CREATE OR REPLACE FUNCTION fun_dimensoes()
>   RETURNS trigger AS
> $BODY$
> DECLARE
>

    esquema    varchar(20);
    tabela    varchar(50);


>     tipo    varchar(20);
>     srid    integer;
> BEGIN
>

esquema :=     TG_TABLE_SCHEMA;
tabela    :=     TG_TABLE_NAME;


>     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);
>
>     IF (tipo = 'POLYGON' OR tipo = 'MULTIPOLYGON') THEN
>         IF NOT EXISTS(SELECT column_name FROM information_schema.columns
>                 WHERE table_schema = TG_TABLE_SCHEMA
>                 AND table_name = TG_TABLE_NAME
>                 AND column_name='area') THEN
>

EXECUTE 'ALTER TABLE ' || quote_ident(esquema) || '.' ||
quote_ident(tabela) || ' ADD COLUMN area bigint';


>             IF (srid = 23030 OR srid = 25830) THEN
>

EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) ||
' SET area = ST_Area(geom)::bigint';


>             ELSIF (srid = 4326) THEN
>

EXECUTE 'UPDATE ' || quote_ident(esquema) || '.' || quote_ident(tabela) ||
' SET area = ST_Area(Geography(geom))::bigint';


>             END IF;
>         ELSE
>             IF (srid = 23030 OR srid = 25830) THEN
>                 NEW.area = ST_Area(NEW.geom)::bigint;
>             ELSIF (srid = 4326) THEN
>                 NEW.area = ST_Area(Geography(NEW.geom))::bigint;
>             END IF;
>         END IF;
>     END IF;
>
> RETURN NEW;
> END;
> $BODY$
>   LANGUAGE 'plpgsql' VOLATILE
>   COST 100;
>
> 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();
>
_______________________________________________
pgbr-geral mailing list
[email protected]
https://listas.postgresql.org.br/cgi-bin/mailman/listinfo/pgbr-geral

Responder a