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 :

PLPGSQL : Mon trigger boucle t'il sur lui même ?


Sujet :

PostgreSQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut PLPGSQL : Mon trigger boucle t'il sur lui même ?
    Bonjour,

    je pense avoir un souci avec un trigger.
    En résumé, j'ai une table contact avec un téléphone, un email et une date de mise à jour pour ces 2 champs.

    Mon trigger appelle ( en after) une fonction plpgsql qui compare les valeurs NEW et OLD pour vérifier si il y a besoin d'archiver l'ancienne valeur avant remplacement.
    Quand ceci est fait, il fait un update de la date de mise à jour.

    Si je ne fais pas l'update de la date, tout marche bien. Si je le fais, j'ai ce message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    NOTICE:  Modification de tel1
    NOTICE:  Validation de l enregistrement
    CONTEXT:  SQL statement "UPDATE abadr SET datestoptel1=now() WHERE idadr= $1 "
    PL/pgSQL function "datemajabadr" line 17 at SQL statement
    NOTICE:  Modification de tel1
    NOTICE:  Mise à jours de l enregistrement

    Le code de la fonction est :
    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
     
    CREATE OR REPLACE FUNCTION archivageAbadr() RETURNS TRIGGER AS $$
    DECLARE
    	utilisateur TEXT;
    	isModified BOOL;
    BEGIN
    	utilisateur := 'herve'
    	isModified := false;
     
     
    	-- Téléphone 1
    	IF (OLD.tel1!=NEW.tel1 OR OLD.stoptel1!=NEW.stoptel1 )
    	THEN
    		DELETE FROM abadrhisto WHERE idadr=OLD.idadr AND donnee='tel1';
        	INSERT INTO abadrhisto (idadr,donnee,valeur,date,par) SELECT OLD.idadr,'tel1',OLD.tel1 || '/' || OLD.stoptel1 || '/' || OLD.datestoptel1, now(),utilisateur FROM abadr where idadr=OLD.idadr;
    		UPDATE abadr SET datestoptel1=now() WHERE idadr=OLD.idadr;
    		RAISE NOTICE 'Modification de tel1';
    	END IF;
    	RETURN NEW;
    END;
    $$ LANGUAGE plpgsql;
    Le trigger est définie ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    CREATE TRIGGER tarchivageAbadr BEFORE UPDATE ON abadr 
    	FOR EACH ROW EXECUTE PROCEDURE archivageAbadr();
    En gros, je me demande si le fais de faire un update sur la table en cours ne redéclenche pas le trigger.

    Est ce ma façon de modifier la valeur de la ligne qui est mauvaise ? J'ai essayé NEW.champ:=now() mais pas de résultat....

    Si quelqu'un a une idée, je le remercie d'avance.

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Août 2007
    Messages
    128
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 128
    Points : 143
    Points
    143
    Par défaut
    En gros, je me demande si le fais de faire un update sur la table en cours ne redéclenche pas le trigger.
    Si, bien sûr.

    Est ce ma façon de modifier la valeur de la ligne qui est mauvaise ? J'ai essayé NEW.champ:=now() mais pas de résultat....
    Tu te trouves dans un TRIGGER AFTER, donc la ligne est déjà mise à jour. Toute modification de NEW sera non répercutée. Il te faut donc un TRIGGER BEFORE et ne pas faire un UPDATE supplémentaire, mais plutôt le

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2005
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2005
    Messages : 72
    Points : 54
    Points
    54
    Par défaut
    Merci bien c'est exactement ça

    Bon week end

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [1.x] [sfForm] Stratégie pour un formulaire qui boucle sur lui-même
    Par Vince57 dans le forum Symfony
    Réponses: 3
    Dernier message: 04/11/2010, 21h01
  2. mon curl boucle sans que je lui demande
    Par speed034 dans le forum Langage
    Réponses: 1
    Dernier message: 16/09/2009, 05h40
  3. Rotation d'un objet sur lui-même
    Par Ninouw dans le forum OpenGL
    Réponses: 6
    Dernier message: 29/12/2006, 09h40
  4. [Rotation] Faire tourner un cube sur lui-même
    Par cyber_N dans le forum OpenGL
    Réponses: 4
    Dernier message: 14/07/2005, 21h29
  5. Réponses: 2
    Dernier message: 29/09/2004, 09h07

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