IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PostgreSQL Discussion :

Problème de mise à jour de données via un trigger sur une table postGIS


Sujet :

PostgreSQL

  1. #1
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 96
    Points
    96
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    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.

  3. #3
    Membre régulier
    Inscrit en
    Février 2005
    Messages
    250
    Détails du profil
    Informations forums :
    Inscription : Février 2005
    Messages : 250
    Points : 96
    Points
    96
    Par défaut
    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 ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Points : 2 890
    Points
    2 890
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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;

Discussions similaires

  1. Réponses: 3
    Dernier message: 15/09/2008, 08h32
  2. Problème de mise à jour des données sur un onglet
    Par PenPen_lepingouin dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 26/06/2008, 17h49
  3. mise à jour des données via GridView ?
    Par gregcat dans le forum ASP.NET
    Réponses: 1
    Dernier message: 02/10/2007, 13h18
  4. [C#][Access]Problème de mise à jour des données
    Par vvvvv dans le forum ASP.NET
    Réponses: 10
    Dernier message: 11/04/2006, 10h43
  5. Problème de mise à jour de données avec IBClientDataset
    Par Papino dans le forum Bases de données
    Réponses: 6
    Dernier message: 26/09/2005, 14h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo