2017-08-31 1 views
0

MySQLのストアドプロシージャを使用してユーザーのパスワードを変更したいとします。ここでMySQL - ストアドプロシージャでユーザーパスワードを設定する

が作成コードです:ここまで

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'; 

、すべてが良いです。 それから、テーブル "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 ; 

私がストアドプロシージャを呼び出すと、正常に動作します。

call changeusers('Admin','pass','Admin','new',@result); 

call changeusers('Admin','pass','Admin','new',@result) 1 row(s) returned 0.141 sec/0.000 sec 

次に、ユーザーのパスワードをユーザーテーブルのパスワードと同じに設定するようにストアドプロシージャを変更しようとしました。

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 ; 

が、私はこれを得た新しいスクリプトを実行する場合:

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 

私はどんなsugestionsをapreciateだろうし。おかげさまで @Barmarへ

EDIT

感謝。私は自分が望むことをすることができました。 ここに新しいストアドプロシージャがあります。

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 ; 

ありがとうございました。

+0

'SET PASSWORD'の代わりに' ALTER USER'文を使ってみてください。 – Barmar

+0

@Barmar 'ALTER USER'を使ってみましたが、それでも同じ問題があります。 – Lluxed

答えて

0

私はSET PASSWORDパスワードを変数にすることができます、それはリテラル(またはリテラルのパラメータを持つPASSWORD()への呼び出しにする必要がありますが、準備されたステートメントを使用する必要はそうは思わない:。

PREPARE @stmt FROM CONCAT("SET PASSWORD FOR 'usertry'@'localhost' = '", newpass, "'"); 
EXECUTE @stmt; 
関連する問題