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 :

Trigger ne remontant pas la valeur NEW


Sujet :

Requêtes PostgreSQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur SIG
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur SIG
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut Trigger ne remontant pas la valeur NEW
    Bonjour.
    J'ai un souci avec un trigger.
    J'ai une table de dossiers, avec la possibilité de retrouver plusieurs fois un même dossier. L'objectif lors de la modification d'un dossier, est de faire un update de certains champs sur l'ensemble des dossiers ayant le même numéro.
    J'ai donc un trigger qui se déclenche sur un update de champs nommés 'the_geom' ou 'libelle'.
    Lorsque je lance un update avec la valeur de libelle = 'Conforme' , le trigger se déclenche bien, fait ce qu'il faut, mais par contre le NEW.libelle n'est pas remontée dans ma base, la valeur du champ reste en l'état (avec l'ancienne valeur).
    exemple : j'ai un objet avec un identifiant 3121, un libelle de type 'Non conforme',une valeur à 0 dans l'attribut alerte date. Un deuxième dossier a le même numéro (nom_dossier). Je veux que les deux dossier aient une valeur alerte_date égale à 1 lorsque le 3121 bascule en conforme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    update sig_conformite set libelle = 'Conforme' where ogc_fid = 3121;
    Et c'est le cas ! Sauf qu'après l'update, le libelle du 3121 reste à 'Non conforme'

    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
    CREATE TRIGGER t_test_trigger
      BEFORE UPDATE OF the_geom, libelle
      ON sig_conformite
      FOR EACH ROW
      EXECUTE PROCEDURE test_trigger();
     
    ....
    BEGIN
     
    nb_dossier = 0;
    nb_dossier = count(nom_dossier)from sig_conformite where nom_dossier = NEW.nom_dossier;
     
    IF NEW.libelle = 'Conforme' THEN
        NEW.alerte_date = 1;
        raise notice 'nb dossiers :%', nb_dossier;
        IF nb_dossier > 1 THEN
            update sig_conformite set alerte_date = 1 where nom_dossier = NEW.nom_dossier;
        END IF;
    END IF;
     
    return NEW;
    ....
    En simplifiant le trigger je me suis rendu compte que c'est la ligne update sig_conformite set alerte_date = 1 where nom_dossier = NEW.nom_dossier qui met le bazar.
    Je ne comprend pas pourquoi. J'ai supprimé tous les autres trigger (en cas d'interaction) mais le phénomène perdure. Quand je fais un raise notice sur NEW.libelle la valeur est bien 'Conforme', mais en final dans ma table, elle reste à 'Non conforme'.
    J'ai adapté le trigger à une autre table prise au hasard dans ma base de test et le problème se répète.
    Si quelqu'un à une idée sur la source du problème je suis preneur.
    Cordialement
    JP

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Et avec le commit - pas dans le trigger, après l'update ?

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Administrateur SIG
    Inscrit en
    Juillet 2015
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 57
    Localisation : France, Lot et Garonne (Aquitaine)

    Informations professionnelles :
    Activité : Administrateur SIG
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2015
    Messages : 2
    Par défaut
    Bonjour.
    Je ne passe jamais de commit, je pensais que la transaction était de toute façon systématiquement validée !
    J'ai contourné le problème en passant un update de ma valeur dans mon trigger sur l'objet concerné sans tenir compte de la valeur NEW.libelle :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    update sig_conformite set libelle = 'Conforme', alerte_date = 1 where nom_dossier = NEW.nom_dossier and ogc_fid = NEW.ogc_fid;
    Je ne suis pas sûr que ce soit très propre, en tous cas ça semble marcher.
    Ça donne

    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
    BEGIN
     
    nb_dossier = 0;
     
    nb_dossier = count(nom_dossier)from sig_conformite where nom_dossier = NEW.nom_dossier;
    		--raise notice 'nb_dossier : %' , nb_dossier;
    --Modification du libelle
    IF NEW.libelle = 'Conforme' and (OLD.libelle is null or OLD.libelle = 'Non conforme') and NEW.alerte_date = 0 THEN
    	update sig_conformite set libelle = 'Conforme', alerte_date = 1 where nom_dossier = NEW.nom_dossier and ogc_fid = NEW.ogc_fid;
    	IF nb_dossier > 1 THEN
    		update sig_conformite set alerte_date = 1 where nom_dossier = NEW.nom_dossier;
    	END IF;
    ELSEIF NEW.libelle = 'Non conforme' and OLD.libelle = 'Conforme' and NEW.alerte_date = 1 THEN
    	NEW.alerte_date = 0;
    END IF;
    Cordialement

Discussions similaires

  1. Pas de table "new" dans un trigger ?
    Par StringBuilder dans le forum PL/SQL
    Réponses: 9
    Dernier message: 05/12/2011, 19h15
  2. [XHTML 1.1] Valeur d'une option d'un select qui ne remonte pas
    Par Duddy dans le forum Balisage (X)HTML et validation W3C
    Réponses: 1
    Dernier message: 24/12/2010, 19h16
  3. Problème avec un trigger et la valeur ":NEW."
    Par cedrich dans le forum SQL
    Réponses: 8
    Dernier message: 11/02/2009, 17h13
  4. fonction trigger n'enregistre pas la valeur calculée
    Par Capitaine Nemo dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 24/04/2008, 16h26

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