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 10/09/2012 14:03:57

Geo-x
Membre

UPDATE sur plusieurs lignes dans un tirgger before update

Bonjour @ tous,

je vous explique mon prôblème :

J'ai une table concernant le réseau routier avec un ogc_fid, id_voie, long_carto_troncon, long_carto_voie.

Je souhaiterais pour une modification de l'id_voie re-calculer automatiquement toutes les longueurs de voie et les mettre à jour. Cela signifie donc qu'il va falloir mettre à jour la nouvelle longueur de voie, et la longueur de l'ancienne voie.

Pour atteindre cet objectif, j'ai fait un trigger avec une boucle dont la partie qui nous concerne est la suivante (ici l'exemple ne concerne que la MAJ de la nouvelle voie) :

		
FOR champ3 IN SELECT ogc_fid,(SUM(long_carto_troncon)+NEW.long_carto_troncon)AS long_totale_voie FROM bd_adresse WHERE id_voie_bda=NEW.id_voie_bda GROUP BY ogc_fid
LOOP
	NEW.long_carto_voie_bda:=champ3.long_totale_voie;
END LOOP;

Et en fait, rien ne se met à jour hormis la ligne concernée par le changement de champ (c'est à dire que si je modifie l'id_voie de la ligne 32, seul la longueur de voie de cette ligne change).

Je ne peut pas faire un 'UPDATE table SET (...) puisque mon trigger se déclench sur un BEFORE INSERT OR UPDATE.

Pour information la version de psotgres que j'ai est "PostgreSQL 8.3.10, compiled by Visual C++ build 1400" je ne peut donc pas utiliser de curseur.

si vous avez des solutions ou des pistes je suis preneur.

Merci d'avance.

Geo-x

Hors ligne

#2 10/09/2012 22:56:01

gleu
Administrateur

Re : UPDATE sur plusieurs lignes dans un tirgger before update

Vu votre code, il est logique que seule la ligne en cours de modification est modifiée.

Si je comprends bien votre problème, la longueur de voie est une information qui se trouve dans la table dont la mise à jour déclenche le trigger ? et vous ne pouvez pas faire d'UPDATE sinon vous allez redéclencher le trigger ?


Guillaume.

Hors ligne

#3 11/09/2012 08:43:52

Geo-x
Membre

Re : UPDATE sur plusieurs lignes dans un tirgger before update

Bonjour Gleu,

c'est exactement ça le problème, vous avez très bien cerné le problème.

Hors ligne

#4 11/09/2012 10:03:02

rjuju
Administrateur

Re : UPDATE sur plusieurs lignes dans un tirgger before update

Bonjour,

la seule solution que je vois serait de changer l'implémentation, pour ne pas stocker la longueur des voies dans la table mais utiliser une vue pour la calculer. Après se pose bien sur le problème des performances, et peut-être la nécessité de faire une "vue matérialisée maison" avec l'ajout de triggers sur mises à jour et insertion, mais qui du coup ne poseraient pas ce soucis.

Hors ligne

#5 11/09/2012 10:21:15

Geo-x
Membre

Re : UPDATE sur plusieurs lignes dans un tirgger before update

Bonjour rjuju,

Oui c'est ce que je me suis dit, je pourrais socker les voies dans une table et les troncons dans une autre avec une clé étrangére pour faire le lien, mais j'avoue que cette idée ne me séduit pas vraiment...

Hors ligne

#6 13/09/2012 09:36:24

Geo-x
Membre

Re : UPDATE sur plusieurs lignes dans un tirgger before update

Bonjour,

J'ai suivi les conseils à rjuju. J'ai donc créé une vue de ma table unique et je tente de réaliser mes mises à jours directement sur cette vue. Visiblement un autre problème se pose, par rapport àla mise à jour d'une table à l'aide d'une focntion (je le met dans un nouveau post).
Merci.

Dernière modification par Geo-x (13/09/2012 12:02:00)

Hors ligne

Pied de page des forums