使用变量提供用户名和密码时,创建用户时出现语法错误

5

存储过程代码:

CREATE DEFINER = `root` @`localhost` PROCEDURE `P_CreateUser3` (
  IN _Username NVARCHAR(30), IN _Password NVARCHAR(32), IN _DBName VARCHAR(20))
BEGIN
  CREATE USER _Username @'localhost' IDENTIFIED BY _Password ;
  GRANT SELECT, UPDATE, DELETE, INSERT 
  ON    _DBName.* 
  TO    _Username @'localhost' 
  WITH GRANT OPTION ;
END $$

错误代码: 1064 您的SQL语法有误,请检查与您的MySQL服务器版本相对应的手册,以获取正确的语法格式。错误出现在第6行 '_Password; GRANT SELECT, UPDATE, DELETE, INSERT ON `pr'。 请帮我解决这个问题。

2
CREATE USERGRANT语句中将存储过程输入参数用作密码的不支持使用已经在此错误中有记录。 - Michael Berkowski
1
嗯,我甚至不会尝试那样做。直接使用exec('SomeQuery')。 - Tony Hopkinson
看起来我最初已经把它作为答案了。我进行了恢复和取消删除操作。@eggyal - Michael Berkowski
可能是MySQL CREATE USER with a variable?的重复问题。 - Lucio
2个回答

4
很遗憾,将存储过程输入参数用作CREATE USERGRANT语句中的密码是不支持的,这在此错误中有记录。所以你不能实现你尝试的操作。
可以通过使用CONCAT()构建语句来“准备”和“执行”新密码,但这不是一种安全的方法,因此不建议使用。如果您采用这种方式,您将失去所有存储过程的安全性优势。

0

你必须使用预处理语句,因为变量无法直接在查询中进行评估。

DELIMITER $$

DROP PROCEDURE IF EXISTS `create_user`$$

CREATE PROCEDURE `create_user`(
    `user_name` VARCHAR(50), 
    `passwd` VARCHAR(255),
    `ip` VARCHAR(50)
)
BEGIN
   set @sql = concat("CREATE USER '",`user_name`,"'@'",`ip`,"' IDENTIFIED BY '",`passwd`,"'");
   PREPARE stmt1 FROM @sql;
   EXECUTE stmt1;
   DEALLOCATE PREPARE stmt1;

   set @sql = concat("GRANT ALL PRIVILEGES ON * . * TO '",`user_name`,"'@'",`ip`,"' ");
   PREPARE stmt2 FROM @sql;
   EXECUTE stmt2;
   DEALLOCATE PREPARE stmt2;

   FLUSH PRIVILEGES;
END$$

DELIMITER ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接