#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: 1566
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


