Mais

Como criar gatilho para verificar a validade da geometria?


Eu quero criar gatilho para verificar a validade da geometria na tabela espacial. Eu tenho uma mesa:

CRIAR TABELA vec_geometry (id bigserial is_valid boolean, invalid_reason character (128), geom geography)

Quando tento criar uma função de gatilho, recebo o erro:

CREATE FUNCTION geom_valid_check () RETURNS trigger AS $ BODY $ WITH teste como (SELECT * FROM ST_IsValidDetail (NEW.geom)) UPDATE vec_geometry SET is_valid = (SELECT valid FROM test), invalid_reason = (SELECT motivo FROM test) WHERE id = NEW. eu ia; RETURN NULL; $ BODY $ LANGUAGE plpgsql VOLATILE NOT LEAKPROOF; Ocorreu um erro: ERROR: erro de sintaxe em ou próximo a "WITH" LINE 3: WITH teste como (SELECT * FROM ST_IsValidDetail (NEW.geom))

Como reescrever a função para fazê-la funcionar?


Referindo-se à documentação, suspeito que você deseja fazer algo como o seguinte

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 :: Geometria); NEW.is_valid = válido (val); NEW.invalid_reason = motivo (val); RETORNAR NOVO; FIM; $ geom_valid_check $ LANGUAGE plpgsql VOLATILE NOT LEAKPROOF; CRIAR TRIGGER vec_geometry_is_valid ANTES DE INSERIR OU ATUALIZAR ON vec_geometry PARA CADA LINHA EXECUTAR PROCEDIMENTO 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;

Você notará que ele não está tentando atualizar a tabela diretamente, mas está alterando a nova linha antes de ser inserida ou atualizada na tabela.