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

SQL Procédural MySQL Discussion :

Erreur lors du déclenchement du trigger


Sujet :

SQL Procédural MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut Erreur lors du déclenchement du trigger
    bonjour tout le monde, je suis en train de développer une application dont les utilisateurs sont les mêmes utilisateurs que dans MySQL. Pour cela, j'ai créer un trigger qui une fois un utilisateur est crée dans ma base, il crée à son tour un user avec le même login et mode de passe. Voici le code du trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE TRIGGER user_ai AFTER INSERT ON UTILISATEUR FOR EACH ROW
    BEGIN  
        if(new.ut_access = 1)  
        then
           GRANT ALL PRIVILEGES ON *.* TO 'new.ut_login'@'%' IDENTIFIED BY 'new.ut_mdp' WITH GRANT OPTION;
        end if;
    END
    /
    Le problème c'est que lorsque j'insère un nouveau utlisateur, une erreur se produit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1146 (42S02): Table 'mysql.user' doesn't exist
    .
    Pour récapituler, je désire que mes utilisateurs de l'application se connectent avec les comptes crées dans la base.
    Est ce que quelqu'un pourrait m'indiquer la source d'erreur. Comment faire pour ma gestion des utilisateur.
    Je vous remercie d'avance.
    Cordialement.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    ça ne peut pas marcher comme ça, à chaque fois qu'un utilisateur est créé tu tentes de re-créer le même compte 'new.ut_login'@'%'.

    Pour mettre des éléments dynamiques dans une requête, le seul moyen est de faire des prepared statements, mais ça n'est pas possible dans un trigger.

    Tu peux utiliser la table mysql.user :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    create trigger user_ai after insert on utilisateur
    for each row
    begin
    insert into mysql.user (host, `user`, `password`,
    Select_priv, Insert_priv, Update_priv, Delete_priv, Create_priv, Drop_priv, Reload_priv, Shutdown_priv, Process_priv, File_priv, Grant_priv, References_priv, Index_priv, Alter_priv, Show_db_priv, Super_priv, Create_tmp_table_priv, Lock_tables_priv, Execute_priv, Repl_slave_priv, Repl_client_priv, Create_view_priv, Show_view_priv, Create_routine_priv, Alter_routine_priv, Create_user_priv, Event_priv, Trigger_priv,
    ssl_type, ssl_cipher, x509_issuer, x509_subject)
    values (
    '%', new.ut_login, password(new.ut_mdp),
    'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y',
    '', '', '', ''
    ) ;
    end ;
    Toutefois, cette modification ne sera prise en compte que lorsque tu feras un FLUSH PRIVILEGES, ce qui est à nouveau interdit dans un trigger. Il ne te reste plus qu'à programmer le flush à intervalles réguliers, par exemple...

  3. #3
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut
    Bonjour, merci de votre réponse. En fait j'ai essayé votre solution mais le fait de lancer "FLUSH PRIVILEGES" à intervalles de temps n'est pas une solution trés appropriée. J'ai pensé à utiliser la commande
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GRANT ALL PRIVILEGES ON *.* TO new.ut.login IDENTIFIED BY new.ut.mdp ;
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '.ut_login@'%' IDENTIFIED BY new.ut_mdp WITH GRANT OPTION' at line 5
    [/CODE]

    Bien que cette commande marche bien depuis l'editeur de MySQL. Est ce que vous pouvez m'indiquer c'est quoi mon erreur.
    Merci d'avance,
    Cordialement

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    L'erreur est que le login et le password ne peuvent pas être des variables.

  5. #5
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut
    Merci pour cet ecalaircissement. Il ne me reste que traiter ce problème dans mon code.
    Merci de votre patience et collaboration.

  6. #6
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut Problème avec trigger et procédure stockée
    Bonjour tout le monde, j'ai bien posé mon problème mais je ne suis pas convaicu pourquoi ce que la méthode que j'ai employé ne fonctionne pas.
    C'est pour cela que je présente une 2ème fois ma problèmatque. En fait, je désire que lorsque j'insère dans ma table utilisateur, je crée automatiquement un user avec les mêmes login et mot de passe que l'utilisateur crée depuis l'application.
    Pour cela j'ai pensé à un trigger dont le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TRIGGER user_ai
      AFTER INSERT
      ON utilisateur FOR EACH ROW
    BEGIN  
      Declare code varchar (15); 
      Declare pwd varchar (40);
      set code = concat('',new.ut_login,'', @,'%');
      set pwd =  concat('',new.ut_mdp,'');  
      GRANT ALL PRIVILEGES ON *.* TO code IDENTIFIED BY pwd WITH GRANT OPTION;
    END
    Mais ça n'a pas marché et j'ai l'erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     #42000You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'pwd;  
      END'
    A noter que si j'enlève "IDENTIFIED BY pwd WITH GRANT OPTION" ca marche et je ne sais pas pourquoi !.
    J'ai donc opté pour une procédure stockée dont le code est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    CREATE PROCEDURE P_(login VarChar(15), mdp VarChar(40))
      MODIFIES SQL DATA
    BEGIN  
      Declare code varchar (15); 
      Declare pwd varchar (40);
      set code = concat('',login,'', @,'%');
      set pwd =  concat('',mdp,'');  
      create user code; 
      UPDATE mysql.user set password = password(pwd) WHERE 'user' = code;
    END
    /
    Mais j'ai une autre erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #HY000Operation CREATE USER failed for 'code'@'%'
    J'ai bcp essayé mais en vain. Est ce que quelqu'un pourrait m'expliquer la cause de mon echec et surtout me proposer une solution pour ça.
    Je vous remercie d'avance.
    Cordialement.

  7. #7
    Membre Expert

    Homme Profil pro
    SDE
    Inscrit en
    Août 2007
    Messages
    2 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : SDE

    Informations forums :
    Inscription : Août 2007
    Messages : 2 013
    Par défaut
    Bonjour,

    L'erreur viens du fait qu'il ne faut pas utiliser de ' autours du login, mais seulement du host. Par exemple : user@'%'.

    Par ailleurs, pourquoi utiliser un trigger sur une table indépendante, et ne pas créer directement l'utilisateur ?

  8. #8
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut
    Merci de votre réponse, mais j'ai essayé même sans ' et tjs ça ne marche pas.
    J'ai aussi essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    CREATE PROCEDURE create_user(code VarChar(15), pwd VarChar(40))
    BEGIN
       PREPARE cmd FROM 'GRANT ALL PRIVILEGES ON *.* TO ? identified by ?  WITH GRANT PRIVILEGES';
       SET @user_id = concat(code,@,''',%,''');
       SET @user_pwd = concat(',pwd,'); 
       EXECUTE cmd USING @user_id, @user_pwd; 
       DEALLOCATE PREPARE cmd;  
    END;
    mais j'ai cette erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '? identified by ? WITH GRANT OPTION'
    Ce que j'arrive pas a comprendre c'est pourquoi ça coince qu'avec le mot de passe.

  9. #9
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 287
    Par défaut
    comme je te l'ai déjà indiqué, ça ne peut pas marcher parce que le user et le mot de passe doivent être des constantes, autrement dit tapés tels quels dans la requête, et non passer par des variables.

    Si tu crois que ça marche pour le user, relis bien le message d'erreur :

    #HY000Operation CREATE USER failed for 'code'@'%'
    Tu as créé un utilisateur dont le nom est code et non pas le paramètre passé à ta proc stock.

    Tu peux le faire en proc stock, en utilisant les prepared statements :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE PROCEDURE P_(login VarChar(15), mdp VarChar(40))
      MODIFIES SQL DATA
    BEGIN  
      SET @sql = CONCAT('GRANT ALL PRIVILEGES ON *.* TO ', login, '@''%'' IDENTIFIED BY ''', mdp, '''') ;
      PREPARE req FROM @sql ;
      EXECUTE req ;
      DEALLOCATE PREPARE req ;
    END
    Néanmoins, MySQL refusera d'exécuter cette procédure dans un trigger.

  10. #10
    Membre éclairé
    Inscrit en
    Février 2008
    Messages
    276
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 276
    Par défaut
    Merci de votre réponse. Je viens de comprendre pourquoi ça ne marche pas.
    Merci encore pour votre collaboration.

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

Discussions similaires

  1. erreur lors de la création trigger mysql
    Par risfox dans le forum Requêtes
    Réponses: 2
    Dernier message: 25/09/2011, 11h42
  2. erreur lors de la compilation d'un trigger
    Par scofild20 dans le forum SQL
    Réponses: 2
    Dernier message: 27/04/2009, 01h04
  3. Erreur lors de la création d'un trigger
    Par dnboa dans le forum PL/SQL
    Réponses: 7
    Dernier message: 17/09/2008, 11h58
  4. Erreur lors de la création d'un trigger
    Par max72100 dans le forum SQL Procédural
    Réponses: 12
    Dernier message: 26/06/2008, 14h15
  5. Réponses: 0
    Dernier message: 22/06/2008, 17h55

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