PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 16/10/2015 21:35:21

gbodet
Membre

Règles sur vue : pb de modifications de valeurs via une vue

Bonjour,

Depuis 1 semaine, j'ai des problèmes de modifications de données via une vue et la définition de règles.

J'ai 2 tables, une contenant la géométrie et l'autre les attributs. Chacune possède un identifiant idgeo en integer.

J'ai une vue qui permet de rassembler les valeurs des 2 tables

CREATE OR REPLACE VIEW m_amenagement.geo_v_site_ope AS 
 SELECT row_number() OVER () AS gid, o.idgeo, so.l_nom, so.dest, so.date_crea, 
    so.z_proced, o.ref_spa, so.date_sai AS date_sai_att, 
    so.date_maj AS date_maj_att, o.date_sai AS date_sai_obj, 
    o.date_maj AS date_maj_obj, so.op_sai AS op_sai_att, o.op_sai AS op_sai_obj, 
    o.surf_brt, o.geom
   FROM m_amenagement.an_amt_site_ope so, r_objet.geo_objet_peri_ope o
  WHERE so.idgeo = o.idgeo;

Sur cette vue, j'y intègre une règle de modification

CREATE OR REPLACE RULE metier_modif_site_ope AS
 ON UPDATE TO m_amenagement.geo_v_site_ope
    DO INSTEAD UPDATE m_amenagement.an_amt_site_ope SET
    idgeo = new.idgeo,
    l_nom= new.l_nom,
    dest = new.dest,
    date_crea = new.date_crea,
    date_maj = now(),
    op_sai = new.op_sai_obj
WHERE an_amt_site_ope.idgeo = new.idgeo;

Pour faire mes insertions et modifications, j'utilise QGIS 2.4 sur une base Postgres 9.0.

Après saisie, j'obtiens 3 valeurs dans me table attributaire

idgeo date_crea
100    2012
200    2015
300    2016

Si je modifie dans QGIS via ma vue la date 2015 pour idgeo=100, il l'enregistre dans l'idgeo = 300.
Quelles solutions ou quels problèmes peuvent être la cause de ce phénomène ?

Faut-il obligatoire que l'identifiant unique idgeo soit une séquence ?

Merci pour vos réponses, je galère.

Cordialement

Hors ligne

#2 16/10/2015 22:37:43

gbodet
Membre

Re : Règles sur vue : pb de modifications de valeurs via une vue

Re-

J'apporte des éléments de réponses.
En passant par un idgeo avec une séquence, le pb a priori disparaît.

Mais j'avais également une vue appelant 3 tables, et là les modifications posaient également pb avec ma règle. En ne gardant que 2 tables, le pb disparait.

Bizarre quand même. Je suis preneur de toutes informations pouvant m'aider à mieux comprendre.

Merci

Hors ligne

#3 17/10/2015 08:44:03

Marc Cousin
Membre

Re : Règles sur vue : pb de modifications de valeurs via une vue

J'imagine que la rule devrait utiliser comme clause where an_amt_site_ope.idgeo = old.idgeo , et non pas new.idgeo . Pas sûr que ça soit la cause du problème, mais déjà, cela me semble faux.

Sinon, vous feriez mieux de faire un trigger «INSTEAD OF» qu'une rule. Les rules sont vraiment piégeuses, et régulièrement, les développeurs PostgreSQL cherchent des solutions pour s'en débarrasser (sans succès, pour le moment, malheureusement).


Marc.

Hors ligne

#4 17/10/2015 21:03:36

gbodet
Membre

Re : Règles sur vue : pb de modifications de valeurs via une vue

Bonsoir,

OK merci, je suis en cours de développement en ce moment, et j'ai opté pour le maximum de trigger pour tout ce qui est modification de données liées à la géométrie.

Je suis resté sur le système de règles pour la simple modification d'attributs liés à une vue contenant ma géométrie. J'ai développé des triggers pour la modification attributaire des tables de niveaux supérieurs suites à la modif de la table appelée par cette vue.

J'ai également introduit pour la clé primaire idgeo une séquence commune.

Depuis cela semble bien fonctionné.

Je note votre remarque sur les règles qui me rassure quand à mes soucis antérieurs.

Merci

Hors ligne

Pied de page des forums