Problem wygląda następująco.
Mam zbudowaną tabelę w bazie danych Postgresql.
Na niej zbudowałem widok, na widoku trigger + funkcję dla niego odpowiedzialne za edycję danych (insert/update/delete).
Edycja danych w widoku działa prawidłowo, wszystkie operacje wykonują się poprawnie.
Jest natomiast problem ze snapowaniem dla nowo powstałych elementów (nowo narysowanych lub tych powstałych przez podział już istniejących).
Nie działa dla nich przyciąganie.
Po ponownym odczycie widoku, można już się snapować do tych obiektów.
Można "uwidocznić" obiekt dla przyciągania, gdy się go "poruszy" narzędziem do modyfikacji vertexów - wtedy obiekt staje się "snapowalny"
Znalazłem podobny wątek ze zgłoszonym błędem dla tabeli Oracle'a edytowanej w QGis.
https://issues.qgis.org/issues/12690
Sprawdziłem i przy bezpośredniej edycji tabeli Postgis, problem się nie pojawia - czyli to wina operacji na widokach.l
Coś robię nie tak czy problem leży raczej po stronie QGis i należy zgłaszać błąd twórcom?
Ktoś coś doradzi?
Używam QGis 2.18.17, Postgresql 9.6, Postgis 2.3.3
Poniżej kod umożliwiający odtworzenie sytuacji.
Kod:
CREATE SEQUENCE public.testw_id_seq
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
CREATE TABLE public.testw
(
id integer NOT NULL DEFAULT nextval('testw_id_seq'::regclass),
atr1 integer DEFAULT 1,
atr2 integer,
geom geometry(Polygon,2177),
CONSTRAINT testw_pkey PRIMARY KEY (id)
);
CREATE INDEX testw_geom_idx1 ON public.testw USING gist (geom);
CREATE OR REPLACE FUNCTION public.v_test_mod()
RETURNS trigger AS
$BODY$
DECLARE
val integer;
BEGIN
IF TG_OP = 'INSERT' THEN
val = nextval('testw_id_seq');
insert into testw (id, atr1, atr2, geom )
VALUES
(val, 1, NEW.atr2, NEW.geom);
RETURN NEW;
ELSIF TG_OP = 'UPDATE' THEN
update testw set geom = NEW.geom, atr1 = NEW.atr1, atr2 = NEW.atr2 where id = OLD.id;
RETURN NEW;
ELSIF TG_OP = 'DELETE' THEN
delete from testw where id =OLD.id;
RETURN NULL;
END IF;
RETURN NEW;
END;
$BODY$
LANGUAGE plpgsql VOLATILE SECURITY DEFINER
COST 100;
CREATE TRIGGER v_testw_1_tr
INSTEAD OF INSERT OR UPDATE OR DELETE
ON public.v_testw_1
FOR EACH ROW
EXECUTE PROCEDURE public.v_test_mod();