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

Requêtes PostgreSQL Discussion :

[Postgres 8.2] Procédure stokée - TRIGGER pour saisie automatique


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 7
    Points
    7
    Par défaut [Postgres 8.2] Procédure stokée - TRIGGER pour saisie automatique
    Bonjour,

    Je travail actuellement sur une table dans postgres qui contient plus de 66000 lignes.
    Lors de la modification d'un des enregistrements, je voudrais qu'une procédure stockée se déclenche.
    condition :
    Si UPDATE ou INSERT de façon général :
    => insert ou update de la date de mise à jour dans le champs "date_modif" (timestamp)
    SI UPDATE OU INSERT du champ "Libellé NA"
    => Mise à jour du "NAF réel" sur une requête imbriqué
    SI UPDATE OU INSERT du champ the_geom
    => Mise à jour des champs "[G] Longitu" et "[G] Latitu"


    si j'optimise mes procédures en 2 triggers en ajoutant la modification de date du jour , j'obtient :
    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
     
     
    BEGIN
     
    IF NEW.the_geom <> OLD.the_geom THEN
            UPDATE fc2009 SET "[G] Longit"=x(the_geom),"[G] Latitu"=y(the_geom) 
            WHERE NEW.the_geom <> OLD.the_geom;
        END IF;
        NEW.date_modif := current_timestamp;
        RETURN NEW;
    END;
     
    CREATE TRIGGER recalcul_xy
      AFTER INSERT OR UPDATE
      ON fc2009
      FOR EACH ROW
      EXECUTE PROCEDURE update_xy();
    et

    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
     
     
    BEGIN
    IF new."Libellé AP" <> old."Libellé AP" THEN
    UPDATE fc2009 
            SET "NAF réel"=(SELECT naffc2009."NAF" 
            FROM naffc2009 WHERE fc2009."Libellé AP"=naffc2009."LibNAF") 
            WHERE fc2009."NAF réel" is null OR new."Libellé AP" <> old."Libellé AP";
        END IF;
        NEW.date_modif := current_timestamp;
            RETURN NEW;
    END;
     
    CREATE TRIGGER trig_update_naf
      AFTER INSERT OR UPDATE
      ON fc2009
      FOR EACH ROW
      EXECUTE PROCEDURE insertnaf();
    Il s'avère que la modification de la date de mise à jour ne se déclenche pas..
    En gros, si je mets BEFORE, il me modifie toute la table ! si je mets AFTER, il me modifie rien..
    du coup je reste sur BEFORE et j'essaie de contraindre postgres à déclencher la procédure seulement sur les champs qui ont fait l'objet d'un UPDATE ou INSERT.

    pour cela j'ai testé la condition WHEN ou alors FOR UPDATE mais rien n'ets concluant..

    Bref si vous pouviez m'aiguiller sur la bonne démarche à suivre..
    merci d'avance

    ampex

  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
    Les valeurs des colonnes ne sont jamais à NULL?
    Si elles peuvent l'être il faut utiliser IS DISTINCT FROM plutôt que l'inégalité pour tester si la valeur change. Sinon la comparaison sera toujours fausse si une des deux valeurs est NULL.

    A part ça je crois que ta fonction devrait retourner NEW tout le temps, et non pas uniquement lorsque le IF est pris.

  3. #3
    Futur Membre du Club
    Inscrit en
    Mai 2006
    Messages
    24
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 24
    Points : 7
    Points
    7
    Par défaut
    Merci estofilo pour ta réponse.
    Effectivement DISTINCT FROM a l'air de mieux fonctionner..
    néanmoins je suis un peu perdu aujourd'hui.
    J'ai beau tourner les procédure dans tout les sens je n'arrive pas à ce que je veux :
    -renseigner le champ date_modif avec un current_timestamp lors d'un update ou insert
    -Update le champ "NAF réel" en fonction du champ "Libellé AP" lors de la modification de "Libellé AP".

    J'ai même essayé de renseigner une nouvelle table -historique- avec un insert des valeur old et new mais cela pose enocre d'autre problème (notamment de type de variable).

    Personne n'a trouvé ou développé une procédure semblage à ce que je recherche ? je tourne en rond avec google.. :/

    merci encore

    ampex

  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
    D'abord la mise à jour du champ date_modif devrait marcher si c'est bien dans un trigger BEFORE UPDATE.

    Pour le reste, je ne sais pas le résultat auquel tu veux arriver, mais les requêtes dans les 2 triggers paraissent plutôt suspicieuses.

    Par exemple sur cet update:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    UPDATE fc2009 SET "[G] Longit"=x(the_geom),"[G] Latitu"=y(the_geom) 
            WHERE NEW.the_geom <> OLD.the_geom;
    Le WHERE ne sert à rien puisque c'est le même test que le IF au-dessus. Si comme si tu écrivais WHERE true, donc ça modifie toute la table.
    Si tu veux modifier uniquement la ligne ayant déclenché le trigger il faut utiliser
    NEW.colonne=valeur et non pas une requête UPDATE.

Discussions similaires

  1. Application VB pour saisie automatique
    Par AlexTheDoctor dans le forum Windows Forms
    Réponses: 5
    Dernier message: 19/11/2009, 11h48
  2. Réponses: 4
    Dernier message: 22/06/2006, 11h01
  3. Réponses: 3
    Dernier message: 09/11/2004, 14h43
  4. Réponses: 3
    Dernier message: 09/09/2004, 11h31
  5. [Comparatif] Procédures stockées, triggers, etc.
    Par MCZz dans le forum Décisions SGBD
    Réponses: 3
    Dernier message: 28/08/2002, 12h27

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