Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 4 sur 4
  1. #1
    Membre du Club
    Inscrit en
    février 2005
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 212
    Points : 52
    Points
    52

    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

  2. #2
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 822
    Points : 2 517
    Points
    2 517

    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 du Club
    Inscrit en
    février 2005
    Messages
    212
    Détails du profil
    Informations forums :
    Inscription : février 2005
    Messages : 212
    Points : 52
    Points
    52

    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
    Expert Confirmé
    Profil pro
    Inscrit en
    octobre 2008
    Messages
    1 822
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : octobre 2008
    Messages : 1 822
    Points : 2 517
    Points
    2 517

    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 :
    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;

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •