Več

Težava s plastjo View PostgreSQL View v QGIS

Težava s plastjo View PostgreSQL View v QGIS


Imam tabelo in pogled PostgreSQL:

CREATE TABLE lines (geom geometry (MultiLineString, 4326), type type variating (254), login text, gid serial NOT NULL, CONSTRAINT lines_pkey PRIMARNI KLJUČ (gid)) CREATE OR REPLACE VIEW lines_view AS SELECT lines.geom, lines.type, lines.gid IZ Linij; CREATE OR REPLACE PRAVILO add AS ON INSERT TO lines_view DO INSTEAD INSERT INTO lines (geom, type, login) VALUES (new.geom, new.type, "current_user" ()); Ustvari ali zamenjaj pravilo del AS ON DELETE TO lines_view DO INSTEAD DELETE FROM lines WHERE lines.login = "current_user" () :: text AND lines.gid = old.gid; CREATE OR REPLACE RULE upd AS ON UPDATE TO lines_view DO INSTEAD UPDATE lines SET geom = new.geom, type = new.type, login = "current_user" () WHERE lines.login = "current_user" () :: besedilo IN vrstice. gid = new.gid;

Težava je torej, ko naložim ta line_view v QGIS kot plast in dodam vrstice, po shranjevanju ne morem uporabiti "orodja vozlišča" za nov vrstice ("Orodje vozlišča: ni mogoče zaskočiti na segment na trenutni plasti"). Ko pa na njih uporabljam orodje za premikanje (samo izberite gumb »premakni funkcijo (e)«) in kliknite na nov vrstica) "orodje vozlišča" začne delovati kot običajno. Mi lahko kdo pri tem pomaga?


Predvidevamo, da je edini razlog, zakaj potrebujete te poglede, nadzor nadVpiši sevrednosti stolpca in kdo lahko kakšne vrstice posodobi, potem tukaj dejansko ne potrebujete pogleda.

Začnite z ustvarjanjemVSTAVIsprožilec, da vedno nastaviteVpiši sestolpec:

CREATE OR REPLACE FUNCTION set_login_to_current_user () POVRATI TRIGGER JEZIK plpgsql AS $$ BEGIN NEW.login = current_user; POVRATI NOVO; END $$; CREATE TRIGGER insert_on_lines PRED VSTAVLJANJE V vrstice ZA VSAK RED IZVEDBENI POSTOPEK set_login_to_current_user ();

(Upoštevajte, da je to nekoliko drugače kot aDEFAULTvrednost. ADEFAULTbi prišlo le, če ne bi bila podana nobena vrednost. Ta sprožilec preglasi vrednost, tudi če jo je uporabnik poskušal podati.)

Zdaj dodajte sprožilec posodobitve, ki preprečuje spreminjanje vrstic, ki ne pripadajo trenutnemu uporabniku:

USTVARI ALI ZAMENI FUNKCIJO prepreči_update_for_other_user () POVRATI TRIGGERSKI JEZIK plpgsql AS $$ BEGIN IF OLD.login! = Current_user THEN RAISE EXCEPTION 'Poskušal urediti vrstico, ki pripada drugemu uporabniku'; DRUGO NOVO.login = trenutni_korisnik; POVRATI NOVO; END IF; END $$; CREATE TRIGGER update_on_lines PRED POSNOVITEV V vrsticah ZA VSAK RED IZVEDBENI POSTOPEK prepre_update_for_other_user ();

In nazadnje, dodajte sprožilec, ki preprečuje brisanje:

USTVARI ALI ZAMENI FUNKCIJO prepreči_delete_for_other_users () VRNI TRIGGERSKI JEZIK plpgsql AS $$ BEGIN IF OLD.login! = Current_user THEN RAISE EXCEPTION 'Poskuša izbrisati vrstico drugega uporabnika'; DRUGI POVRATAK STAR; END IF; END $$; Ustvari TRIGGER delete_on_lines PRED IZBRIŠENJEM v vrsticah ZA VSAK RED IZVEDBENI POSTOPEK prepreči_delete_for_other_users ();

Preizkusil sem, da to deluje pravilno s PostgreSQL 9.3/PostGIS 2.1.4 in QGIS 2.8.1, a ker uporablja samo osnovne funkcije PostgreSQL, pričakujem, da bo to delovalo v višjih različicah vsega.

Upoštevajte, da v primerih posodabljanja in brisanja prikažem napako, če uporabnik poskuša spremeniti vrstico drugega uporabnika. To je nekoliko drugače od tistega, kar ste objavili, kjer samo tiho ne naredite nič. Tega ne svetujem. Ko tiho zavrne ukaz, lahko uporabnik misli, da so bile njegove spremembe uporabljene, čeprav niso, uporabnik pa je lahko zelo zmeden, ko pozneje ugotovi, da njihove spremembe "manjkajo". Z napako uporabnik takoj ve, da je bila sprememba, ki jo je poskušal zavrniti, lahko ustrezno razveljavi urejanje. Če ti res Če želite nadaljevati tiho, lahko zamenjateDIZAJukaze z

POVRATI NULL;

tiho preprečite urejanje ali brisanje.

Prav tako želim opozoriti, da to samo po sebi ne predstavlja "varnosti", ampak je lahko del rešitve v kombinaciji z drugimi stvarmi. To morate združiti z ustreznimi dovoljenji, da uporabnikom preprečite spreminjanje sprožilcev ali sprožilnih funkcij. Pomembno je, da ne morete filtrirati, katere vrstice lahko določen uporabnik pogled (toda vaše vprašanje tako ali tako ne gre). Prav tako je treba omeniti, da bo PG 9.5 pripravljen za "varnost na ravni vrstice", kar bi bil še boljši način za rešitev tega.


Niste omenili različice qgis niti postgis, qgis 2.10 ne omogoča urejanja tabele brez primarnega ključa - kar bi veljalo za vaš pogled.