Précédent   Forum du club des développeurs et IT Pro > Bases de données > PostgreSQL
PostgreSQL Forum PostgreSQL. Avant de poster -> F.A.Q PostGreSQL Tutoriels PostGreSQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 08/01/2013, 14h27   #1
mcdelay
Membre du Club
 
Inscription : février 2005
Messages : 198
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 198
Points : 51
Points : 51
Par défaut Problème de mise à jour de données via un trigger sur une table postGIS

Bonjour,

J'utilise un WEB SIG (cartographie) me permettant notamment de mettre à jour des objets graphiques.
J'essaye de mettre à jour deux colonnes d'une table par l'intermédiaire de trigger mais je rencontre un souci avec la mise à jour des colonnes quand un objet graphique est crée. Voici le trigger :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
DECLARE
 
 
BEGIN
 
IF(TG_OP='INSERT') THEN
	-- INSERT INTO public.fon_parcelle_transaction_cavm (ogc_fid,the_geom) VALUES (NEW."ROWID",NEW."g");
	UPDATE cav_postgis.sb_data_309 SET superficie = area(NEW.g) WHERE rowid=NEW.rowid;
	UPDATE cav_postgis.sb_data_309 SET commune = public.cad_commune.commune 
	FROM public.cad_commune
	WHERE (ST_IsValid(NEW.g) 
	AND st_within(ST_PointOnSurface(NEW.g),public.cad_commune.the_geom)) 
	AND rowid = NEW.rowid; 
END IF;
 
IF(TG_OP='UPDATE') THEN 
	UPDATE cav_postgis.sb_data_309 SET superficie = area(NEW.g) WHERE rowid=NEW.rowid;
	UPDATE cav_postgis.sb_data_309 SET commune = public.cad_commune.commune 
	FROM public.cad_commune
	WHERE (ST_IsValid(NEW.g) 
	AND st_within(ST_PointOnSurface(NEW.g),public.cad_commune.the_geom)) 
	AND rowid = NEW.rowid; 
 
END IF; 
 
SET dynmap_pgconf.state_trigger_beetween_schemas='';
 
RETURN NEW;
 
END;
Lors de la mise à jour de l'objet graphique via l'applicatif les colonnes "superficie" et "commune" se mettent bien à jour. Par contre c'est lors de l'insertion d'un objet que les colonnes ne se mettent pas à jour. Je pense que je ne maitrise pas trop le comportement de la fonction lors de l'insertion d'un objet. Je souhaite , quand l'objet est créé, mettre à jour les colonnes, j'ai pour cela créé un trigger qui se déclenche après la création de l'objet (AFTER) où les évènements suivants insert update delete sont permis et qui utilise la fonction ci dessus.

Merci pour votre aide !

SD
mcdelay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/01/2013, 10h07   #2
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 702
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 702
Points : 2 347
Points : 2 347
Si le trigger porte sur cav_postgis.sb_data_309, il ne faut pas faire des UPDATE et INSERT sur cette même table à l'intérieur du trigger. Il faut assigner NEW.champ à la valeur qu'on veut pour changer la valeur d'un champ.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 10h16   #3
mcdelay
Membre du Club
 
Inscription : février 2005
Messages : 198
Détails du profil
Informations forums :
Inscription : février 2005
Messages : 198
Points : 51
Points : 51
Merci pour cette réponse.
En fait le trigger se trouve sur une autre table sb_geom_309. Pour donner plus d'explication quand un objet est créé graphiquement dans le logiciel , 1 ligne se créé dans chaque table. 1 dans sb_data_309 avec les données qui sont renseignées dans une fiche et 1 dans sb_geom_309 qui décrit la géométrie. Le but étant pour la colonne superficie de la table sb_data_309 de renseigner automatiquement la superficie de la géométrie en utilisant la fonction area et en indiquant la géométrie qui vient d'être créée "g".
Effectivement on va mettre à jour une valeur d'un enregistrement qui vient d'être créé dans une autre table, est ce possible de faire cela ?
mcdelay est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/01/2013, 14h28   #4
estofilo
Modérateur
 
Inscription : octobre 2008
Messages : 1 702
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 702
Points : 2 347
Points : 2 347
Oui il est possible de mettre à jour une autre table.

Mais peut-être que la ligne correspondante de sb_data_309 n'existe pas encore au moment de l'insertion dans sb_geom_309, auquel cas l'UPDATE ne fait rien.

Ce serait vérifiable avec un code du genre

Code :
1
2
3
4
5
6
7
8
 DECLARE
   cnt int;
 ...
 UPDATE cav_postgis.sb_data_309 ...
 GET DIAGNOSTICS cnt = ROW_COUNT;
 IF cnt=0 THEN
   raise error 'Aucune ligne mise a jour';
 END IF;
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 09h28.


 
 
 
 
Partenaires

Hébergement Web