#1 Fri 09 October 2015 17:27
- gregorybodet
- Participant occasionnel
- Date d'inscription: 9 Oct 2015
- Messages: 18
POSTGIS - Règles de modifications sur une vue (Pb)
Bonjour,
J'ai un problème de mise à jour de géométrie en passant par des règles sur une vue.
Structure des tables :
1 table (nommée o) qui contient mes objets avec 2 champs (idgeo et geom)
1 table (nommée a) qui contient mes données attributaires avec x champs dont idgeo.
Je structure de cette façon car ma table objet interagit avec plusieurs données attributaires gérés par plusieurs services.
Pour accéder aux données de géométries et d'attributs, je créé une vue et sur cette vue j'y intègre des règles d'insertions et de modifications. Les règles d'insertions fonctionnent très bien.
En revanche, la règle de modification pose pb :
- je saisie 2 polygones (ça marche, cf ci-dessous), et j'enregistre
- je modifie une 1ère fois le polygone 100 (ça marche cf ci-dessous), et j'enregistre
- je modifie le polygone 200 et pb : il me garde la géométrie origine du 200, mais il me stocke la géométrie du 200 que je voulais modifier dans le 100 et le 100 d'origine a disparu
Je travaille avec :
PostGis 2.0
QGis 2.4.0
Voici la règle de modification
CREATE OR REPLACE RULE objet_modif_oa AS
ON UPDATE TO vue
DO INSTEAD UPDATE o SET
o.geom = new.geom
WHERE o.idgeo = new.idgeo; -- j'ai essayé avec old, mais le pb est le même.
Si qqun à une piste, je suis preneur car la modification des données alphanumériques par ce système fonctionne très bien.
Cordialement
Hors ligne
#2 Mon 12 October 2015 11:17
- jonathan
- Participant assidu
- Date d'inscription: 16 May 2006
- Messages: 263
Re: POSTGIS - Règles de modifications sur une vue (Pb)
Bonjour,
si idgeo est stable, il ne devrait pas y avoir de difficulté.
J'écrirais :
Code:
where new.idgeo = old.idgeo
Dernière modification par jonathan (Mon 12 October 2015 11:18)
Hors ligne
#3 Mon 12 October 2015 12:12
- gregorybodet
- Participant occasionnel
- Date d'inscription: 9 Oct 2015
- Messages: 18
Re: POSTGIS - Règles de modifications sur une vue (Pb)
Bonjour,
si idgeo est stable, il ne devrait pas y avoir de difficulté.
J'écrirais :Code:
where new.idgeo = old.idgeo
Je viens de tester cette solution
Code:
CREATE OR REPLACE RULE objet_modif_oa AS ON UPDATE TO vue DO INSTEAD UPDATE o SET o.geom = new.geom WHERE new.idgeo = old.idgeo;
Je suis jeté par la base
Code:
ERROR: duplicate key value violates unique constraint "an_urbproj_site_ope_pkey" DETAIL: Key (idgeo)=(200) already exists.
Je cherche toujours de mon côté mais sans succès jusqu'à présent. Pourtant les mises à jour fonctionnent sur ma table attributaire.
Cordialement
Hors ligne
#4 Mon 12 October 2015 14:12
- Nicolas Ribot
- Membre
- Lieu: Toulouse
- Date d'inscription: 9 Sep 2005
- Messages: 1554
Re: POSTGIS - Règles de modifications sur une vue (Pb)
Bonjour,
Quelles sont les définitions de vos tables ?
Dans la définition de votre rule, ca devrait etre plutot:
Code:
DO INSTEAD UPDATE o SET geom = new.geom WHERE idgeo = new.idgeo;
Il y a une erreur avec la notation o.geom = new.geom (o etant considéré comme une colonne de la table o...)
Le test suivant marche (avec idgeo int ou serial):
Code:
drop table if exists o CASCADE ; create table o ( idgeo serial PRIMARY KEY, geom GEOMETRY (POINT, 2154) ); drop table if exists a; create table a ( idgeo serial PRIMARY KEY, attr1 text ); insert into o (geom) values ('srid=2154;POINT(0 0)'::geometry); insert into a (attr1) values ('value 1'); drop view if exists voa; create view voa as select o.idgeo, a.attr1, o.geom from a join o on a.idgeo = o.idgeo; CREATE OR REPLACE RULE objet_modif_oa AS ON UPDATE TO voa DO INSTEAD UPDATE o SET geom = new.geom WHERE idgeo = new.idgeo; update voa set geom = 'srid=2154;POINT(1 1)'::geometry where idgeo = 1; select idgeo, attr1, st_astext(geom) from voa;
Nicolas
Hors ligne
#5 Mon 12 October 2015 15:25
- gregorybodet
- Participant occasionnel
- Date d'inscription: 9 Oct 2015
- Messages: 18
Re: POSTGIS - Règles de modifications sur une vue (Pb)
Bonjour,
Je viens de tester votre proposition sans succès(toujours le pb). Je suis sur des polygones. Je vous joint ci-dessous mon code simplifié à 2 champs.
Code:
-- table des objets CREATE TABLE geo_objet_peri_ope( idgeo character varying(20) NOT NULL, geom geometry(POLYGON, 2154) NOT NULL, CONSTRAINT geo_objet_peri_ope_pkey PRIMARY KEY (idgeo) ); -- table des attributs CREATE TABLE an_urbproj_site_ope( idgeo character varying(20) NOT NULL, l_nom character varying(100), CONSTRAINT an_sa_p_site_pkey PRIMARY KEY (idgeo) ); -- vue d'affichage CREATE OR REPLACE VIEW geo_v_site_ope AS SELECT row_number() over() as gid, o.idgeo, so.l_nom, o.geom FROM an_urbproj_site_ope so, geo_objet_peri_ope o WHERE so.idgeo=o.idgeo; -- règle pour l'insertion CREATE OR REPLACE RULE objet_insert_peri_ope AS ON INSERT TO geo_v_site_ope DO INSTEAD INSERT INTO geo_objet_peri_ope (idgeo,geom) VALUES ( new.idgeo, new.geom ); CREATE OR REPLACE RULE metier_insert_site_ope AS ON INSERT TO geo_v_site_ope DO INSTEAD INSERT INTO an_urbproj_site_ope (idgeo,l_nom) VALUES ( new.idgeo, new.l_nom ); -- règle pour la mise à jour CREATE OR REPLACE RULE objet_modif_peri_ope AS ON UPDATE TO geo_v_site_ope DO INSTEAD UPDATE geo_objet_peri_ope SET idgeo = new.idgeo, geom = new.geom WHERE idgeo = new.idgeo; CREATE OR REPLACE RULE metier_modif_site_ope AS ON UPDATE TO geo_v_site_ope DO INSTEAD UPDATE an_urbproj_site_ope SET idgeo = new.idgeo, l_nom = new.l_nom WHERE idgeo = new.idgeo;
L'insertion et la mise à jour se fait directement dans QGIS. La mise à jour des attributs sans modifier la géométrie se passe bien.
Pour le champ IDGEO, je le laisse en varchar (car il devrait être calculé pour définir un identifiant unique de géométrie), mais je saisie 1, 2,3 à la saisie.
Cordialement
Hors ligne