我基本上是想写一个存储过程来创建一个用户。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生成:
创建由'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] 删除。
我来说两句