MYSQL存储过程

曲布帕林

我基本上是想写一个存储过程来创建一个用户。sql如下:

-- --------------------------------------------------------------------------------
-- Routine DDL
-- Note: comments before and after the routine body will not be stored by the server
-- --------------------------------------------------------------------------------
DELIMITER $$

CREATE DEFINER=`john`@`%` PROCEDURE `create_user`(in userstr char(50), in pass char(50))
BEGIN
    declare str char(52);
    declare mypass char(52);
    declare exec_str char(255);

    set str = concat('\'', userstr, '\'@','\'%\'');
    /*set str = concat('\'', userstr);*/
    /*select str;*/
    set mypass = concat('\'', pass, '\'');

    set @t1 = concat('create user ', str,  ' identified by ', mypass, '; GRANT ALL PRIVILEGES ON *.* TO ', str, ' WITH GRANT OPTION;');
    select @t1;
    prepare stmt1 from @t1;
    /*select stmt1;*/
    execute stmt1;
    deallocate prepare stmt1;
END

上面的代码在执行之前会在下面生成以下字符串。但是我收到一个错误。

SQL生成:

@ t1

创建由'splat'标识的用户'example'@'%';*。*将所有特权授予*。*到GRANT OPTION的'example'@'%';

然后它崩溃了,返回错误1064:14:48:32调用create_user('example','splat')错误代码:1064您的SQL语法有错误;请参见语法。查看与您的MySQL服务器版本相对应的手册以获取正确的语法,以在“ GRANT ALL PRIVILEGES ON”附近使用在第1行的'example'@'%'WITH GRANT OPTION'

我不知道发生了什么。仅供参考,我什至尝试在授予权限后转义*。

我正在运行的版本是:5.6.20

希望您能提供帮助,我敢肯定这将是一件愚蠢的事情。但是我似乎看不到树木茂盛的树木。

亲切的问候约翰

马来语

您的主要问题是您有两个陈述,而不是一个。因此,您必须分别准备和执行它们:

set str = concat('\'', userstr, '\'@','\'%\'');
/*set str = concat('\'', userstr);*/
/*select str;*/
set mypass = concat('\'', pass, '\'');

set @t1 = concat('create user ', str,  ' identified by ', mypass, ';');
select @t1;
prepare stmt1 from @t1;
/*select stmt1;*/
execute stmt1;
deallocate prepare stmt1;

set @t2 = CONCAT('GRANT ALL PRIVILEGES ON *.* TO ', str, ' WITH GRANT OPTION;');

prepare stmt2 from @t2;
execute stmt2;
deallocate prepare stmt2;

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章