Eu tenho uma tabela de linhas nomeada segment
armazenada no reference
esquema e uma tabela de polígonos nomeada communes
em um donnees_externes
esquema. Tento criar um gatilho que divida os recursos dos segment
recursos communes
na atualização do geom
campo ou na inserção de um novo arquivo segment
. Duas situações:
- inserção: o novo recurso deve ser dividido nos limites dos
communes
polígonos, e cada linha resultante deve ter alguns atributos do polígono do qual faz parte - atualização: o recurso existente deve continuar a existir, seu id não deve mudar, mas deve ter uma nova divisão geográfica nos limites dos polígonos e novos atributos, se necessário. Novos recursos devem ser inseridos na mesma tabela para cada novo polígono que a
NEW
geometria intercepta.
Meu código abaixo atualiza o recurso existente de acordo, mas as linhas que deveriam ser inseridas na tabela não o são. Acho que tem algo a ver com a forma como lido com os retornos da função, mas tentei muitas combinações sem sucesso.
CREATE OR REPLACE FUNCTION split_segments_on_communes_and_update_collectivities_codes()
RETURNS TRIGGER AS
$BODY$
DECLARE
rec RECORD;
BEGIN
FOR rec IN
SELECT c.insee_com AS insee_com,
'0' || c.insee_dep AS insee_dep,
c.insee_reg AS insee_reg,
c.code_epci AS code_epci,
(ST_Dump(ST_Intersection(NEW.geom, c.geom))).geom AS geom,
(ST_Dump(ST_Intersection(NEW.geom, c.geom))).path[0] AS "path",
NEW.id_statut,
NEW.propriete,
NEW.author,
NEW.create_date
FROM donnees_externes.commune c
WHERE ST_Intersects(NEW.geom, c.geom)
LOOP
IF rec."path" = 1 OR rec."path" IS NULL THEN
NEW.geom = rec.geom;
NEW.code_reg = rec.insee_reg;
NEW.code_dep = rec.insee_dep;
NEW.code_epci = rec.code_epci;
NEW.code_commune = rec.insee_com;
ELSE
INSERT INTO reference.segment (geom,
id_statut,
propriete,
code_epci,
code_dep,
code_reg,
author,
create_date,
code_commune)
VALUES (
rec.geom,
NEW.id_statut,
NEW.propriete,
rec.code_epci,
rec.insee_dep,
rec.insee_reg,
NEW.author,
NEW.create_date,
rec.insee_com);
END IF;
END LOOP;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql;
CREATE OR REPLACE TRIGGER split_segments_on_communes_and_update_collectivities_codes
BEFORE INSERT
OR UPDATE OF geom
ON reference.segment
FOR EACH ROW
WHEN (pg_trigger_depth() < 1)
EXECUTE PROCEDURE split_segments_on_communes_and_update_collectivities_codes();