2017-08-31 3 views
0

Je veux changer le mot de passe d'un utilisateur en utilisant une procédure stockée dans MySQL.MySQL - Définir le mot de passe de l'utilisateur avec la procédure stockée

Voici le code de création:

CREATE SCHEMA `try` ; 
USE try; 
CREATE TABLE `users` (
`username` VARCHAR(100) NOT NULL, 
`password` VARCHAR(100) NOT NULL, 
PRIMARY KEY(`username`)); 

insert into users values('Admin','pass'); 

create user 'usertry'@'localhost' identified by 'pass'; 
grant select on try.* to 'usertry'@'localhost'; 
grant insert on try.* to 'usertry'@'localhost'; 
grant update on try.* to 'usertry'@'localhost'; 
grant delete on try.* to 'usertry'@'localhost'; 

Jusqu'à ici, tout est bon. Puis j'ai créé une procédure stockée pour changer la table "users".

DELIMITER $$ 
CREATE PROCEDURE `changeusers` (
IN user VARCHAR(255), 
IN pass VARCHAR(255), 
IN newuser VARCHAR(255), 
IN newpass VARCHAR(255), 
OUT result bool) 
BEGIN 
if(user= Binary (Select username from users limit 1) 
and pass= Binary (Select password from users limit 1)) 
    then 
     delete from users where username=user; 
     insert into users values(newuser,newpass); 
     set result=true; 
    else 
     set result=false; 
end if; 
select result; 
END $$ DELIMITER ; 

Lorsque j'appelle la procédure stockée, cela fonctionne bien. Ensuite, j'ai essayé de modifier la procédure stockée pour définir le mot de passe de l'utilisateur comme le mot de passe dans la table des utilisateurs.

DELIMITER $$ 
CREATE PROCEDURE `changeusers` (
IN user VARCHAR(255), 
IN pass VARCHAR(255), 
IN newuser VARCHAR(255), 
IN newpass VARCHAR(255), 
OUT result bool) 
BEGIN 
if(user= Binary (Select username from users limit 1) 
and pass= Binary (Select password from users limit 1)) 
    then 
     delete from users where username=user; 
     insert into users values(newuser,newpass); 

     /*The added line*/ 
     set password for 'usertry'@'localhost' = newpass; 
     /*The added line*/ 

     set result=true; 
    else 
     set result=false; 
end if; 
select result; 
END $$ DELIMITER ; 

Mais quand je lance le nouveau script je suis arrivé ceci:

Error Code: 1064. 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 
     'newpass; 
      set result=true;   
     else    
      set result=false;' 
    at line 13 0.000 sec 

J'aprécier tout sugestions. Merci.

EDIT

Merci à @Barmar. J'étais capable de faire ce que je veux. Voici la nouvelle procédure stockée.

DELIMITER $$ 
CREATE PROCEDURE `changeusers` (
IN user VARCHAR(255), 
IN pass VARCHAR(255), 
IN newuser VARCHAR(255), 
IN newpass VARCHAR(255), 
OUT result bool) 
BEGIN 
if(user= Binary (Select username from users limit 1) 
and pass= Binary (Select password from users limit 1)) 
    then 
     delete from users where username=user; 
     insert into users values(newuser,newpass); 

     /*The added line*/ 
     set @stm = CONCAT("set password for 'usertry'@'localhost' = ",newpass); 
     prepare stmt from @stm; 
     execute stmt; 
     deallocate prepare stmt; 
     /*The added line*/ 

     set result=true; 
    else 
     set result=false; 
end if; 
select result; 
END $$ DELIMITER ; 

Merci beaucoup pour votre aide.

+0

Essayez d'utiliser l'instruction 'ALTER USER' au lieu de' SET PASSWORD' – Barmar

+0

@Barmar J'ai essayé d'utiliser 'ALTER USER', mais j'ai toujours le même problème. – Lluxed

Répondre

0

Je ne pense pas SET PASSWORD permet le mot de passe d'être une variable, il doit être un littéral (ou un appel à PASSWORD() avec un paramètre littéral Vous devez utiliser une instruction préparée.

PREPARE @stmt FROM CONCAT("SET PASSWORD FOR 'usertry'@'localhost' = '", newpass, "'"); 
EXECUTE @stmt;