4 votos

¿Cómo crear un disparador para comprobar la validez de la geometría?

Quiero crear un trigger para comprobar la validez de la geometría en la tabla espacial. Tengo una tabla:

CREATE TABLE vec_geometry 
(
  id bigserial
  is_valid boolean, 
  invalid_reason character(128),
  geom geography
)

Cuando intento crear la función de activación me sale el error:

CREATE FUNCTION geom_valid_check() RETURNS trigger AS
$BODY$
WITH test as (SELECT * FROM ST_IsValidDetail(NEW.geom))
UPDATE vec_geometry 
SET is_valid = (SELECT valid FROM test), 
    invalid_reason = (SELECT reason FROM test)
WHERE id = NEW.id;
RETURN NULL;
$BODY$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF;

An error has occurred:

ERROR:  syntax error at or near "WITH"
LINE 3: WITH test as (SELECT * FROM ST_IsValidDetail(NEW.geom))

¿Cómo reescribir la función para que funcione?

4voto

jennz0r Puntos 48

Refiriéndose a la documentación Sospecho que quieres hacer algo como lo siguiente

CREATE TABLE vec_geometry 
(
  id bigserial,
  is_valid boolean, 
  invalid_reason character(128),
  geom geography
);

CREATE FUNCTION geom_valid_check() RETURNS trigger AS $geom_valid_check$
DECLARE
    val valid_detail;
BEGIN
    val := ST_IsValidDetail(NEW.geom::Geometry);
    NEW.is_valid = valid(val);
    NEW.invalid_reason = reason(val);
    RETURN NEW;
END;
$geom_valid_check$
LANGUAGE plpgsql VOLATILE NOT LEAKPROOF;
CREATE TRIGGER vec_geometry_is_valid BEFORE INSERT OR UPDATE ON vec_geometry
    FOR EACH ROW EXECUTE PROCEDURE geom_valid_check();

INSERT INTO vec_geometry VALUES (1,NULL,NULL,ST_GeomFromText('POLYGON((0 0, 1 1, 1 2, 1 1, 0 0))'));

SELECT * FROM  vec_geometry;

Observará que no está intentando actualizar la tabla directamente, sino que está cambiando la NUEVA fila antes de que se inserte o actualice en la tabla.

0 votos

¿Hay alguna forma de evitar la doble comprobación de la validez de la geometría?

0 votos

@SS_Rebelious han modificado la respuesta para hacer la comprobación una vez.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X