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 :

Mon trigger ne s'exécute pas


Sujet :

Requêtes PostgreSQL

  1. #1
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 015
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut Mon trigger ne s'exécute pas
    Bonjour, j'ai créer un trigger pour ma table users :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    CREATE TRIGGER update_users
      AFTER UPDATE
      ON users
      FOR EACH ROW
      EXECUTE PROCEDURE update_users();
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE OR REPLACE FUNCTION update_users()
      RETURNS trigger AS
    $BODY$
    begin
    delete from code_mdp where id_user=new.id;
     return null;
    end
    $BODY$
      LANGUAGE plpgsql VOLATILE
      COST 100;
    Quand je fais un update de users en java les entrées correspondant à l'id que j'utilise ne s’effacent pas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    	protected void updatePassword() throws SQLException, NamingException, MyException {
    		StrongPasswordEncryptor passwordEncryptor = new StrongPasswordEncryptor();
    		String encryptedPassword = passwordEncryptor.encryptPassword(password);
    		//
    		String query = "UPDATE users SET mdp=? WHERE id=?";
    		try (PreparedStatement prepare = getConn().prepareStatement(query)) {
    			prepare.setString(1, encryptedPassword);
    			prepare.setLong(2, id);
    			if (prepare.executeUpdate() != 1) {
    				throw new MyException("Erreur lors du changement de mot de passe.<br/>");
    			}
    		}
        }
    Je n'ai pas de message d'erreur dans les logs donc difficile de voir ou est le problème.
    Merci.

  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
    Il n'y pas de problème apparent dans ce code mais le fait d'ajouter ça sous le DELETE
    donnerait peut être un indice:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    raise warning 'delete: %, id=%', FOUND, new.id;
    FOUND est un booléen qui vaudra t si au moins une ligne est effaçée par le DELETE et f sinon.
    un RAISE WARNING sort par défaut dans les logs du serveur, car log_min_messages=WARNING

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    349
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 349
    Points : 439
    Points
    439
    Par défaut
    Bonjour,

    Pour commencer, il est toujours bon de tester son trigger directement en SQL



    Sinon:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    CREATE OR REPLACE FUNCTION update_users()
     RETURNS trigger AS $update_users$
    BEGIN
    IF (TG_OP = 'DELETE') THEN
            delete from code_mdp where id_user=OLD.id;
            return OLD;
    END IF;
    END;
    $update_users$ LANGUAGE plpgsql;
    Teste ce code ...

  4. #4
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 015
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    Bonjour, je crée mes trigger via la console SQL, ton code diffère, par contre c'est pas plutôt :
    (Mon trigger doit se lancer après un update)

    Le SQL du trigger semble bon (aucune erreur reportée) mais la fonction n'a pas l'air d'être appelée.
    Merci.

  5. #5
    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
    Au vu de la déclaration du trigger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER update_users
      AFTER UPDATE
      ON users
      etc...
    Ajouter un test TG_OP = 'DELETE' n'a aucun intérêt car il sera toujours faux

    Et un test TG_OP = 'UPDATE' n'a aucun intérêt non plus car il sera toujours vrai

  6. #6
    Membre averti
    Avatar de stc074
    Homme Profil pro
    Codeur du dimanche
    Inscrit en
    Janvier 2009
    Messages
    1 015
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Lozère (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Codeur du dimanche

    Informations forums :
    Inscription : Janvier 2009
    Messages : 1 015
    Points : 407
    Points
    407
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par estofilo Voir le message
    Au vu de la déclaration du trigger:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    CREATE TRIGGER update_users
      AFTER UPDATE
      ON users
      etc...
    Ajouter un test TG_OP = 'DELETE' n'a aucun intérêt car il sera toujours faux

    Et un test TG_OP = 'UPDATE' n'a aucun intérêt non plus car il sera toujours vrai
    C'est bien ce qui me semblait aussi. :-))

Discussions similaires

  1. Tout mon code ne s'exécute pas ..
    Par guigui77 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 02/05/2014, 15h25
  2. Mon trigger ne se déclenche pas
    Par awalter1 dans le forum SQL
    Réponses: 4
    Dernier message: 23/01/2013, 15h57
  3. mon application ne s'exécute pas bien en mode Web
    Par groupe dans le forum GWT et Vaadin
    Réponses: 4
    Dernier message: 16/06/2008, 15h05
  4. Réponses: 11
    Dernier message: 16/06/2008, 03h56
  5. [TPW 1.5] Mon programme ne s'exécute pas
    Par WhiteTigerZ dans le forum Turbo Pascal
    Réponses: 6
    Dernier message: 23/09/2007, 23h29

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