MySQL - 使用存储过程设置用户密码

标签 mysql stored-procedures passwords mysql-error-1064

我想使用 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

如有任何建议,我将不胜感激。 谢谢。

编辑

感谢@Barmar。我能够做我想做的事。 这是新的存储过程。

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 ;

非常感谢您的帮助。

最佳答案

我认为 SET PASSWORD 不允许密码成为变量,它必须是文字(或使用文字参数调用 PASSWORD() .所以你需要使用准备好的语句:

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

关于MySQL - 使用存储过程设置用户密码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45972214/

相关文章:

string - R中的密码生成器功能

MySQL 在结果集中返回的行数少于限制

sql-server - SQL 服务器 : Case with the statement "NOT IN"

c# - Sql Server和.Net是如何处理一个存储过程的

SSH 在登录时要求输入密码而不是密码短语

api - 为什么在移动应用程序和后端 api 之间的每个请求中发送用户名和密码是一个坏主意?

PHP 多查询页面呈现失败

mysql - 带条件的 INSERT SELECT

PHP/MySQL - 使用BLOB为用户创建头像上传功能

stored-procedures - 如何将 dbms.listQueries() 过程添加到 Neo4j 3.1.3 实例?