CREATE USER的语法错误,包含用户名和密码的变量

时间:2012-07-06 20:05:50

标签: mysql

存储过程代码:

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服务器版本对应的手册,以便在'_Password附近使用正确的语法;     GRANT       选择,       UPDATE,       删除,       插入     上       第6行的'pr'

请帮助我。

2 个答案:

答案 0 :(得分:3)

不幸的是,在CREATE USERGRANT语句中将存储过程输入参数用作密码为documented in this bug,因为不支持。所以你实际上无法做你想做的事。

PREPAREEXECUTE可以CONCAT()构建一个在新密码中连接的语句,但这不是一个安全的方法因此不推荐。如果你这样做,你将失去存储过程的所有安全优势。

答案 1 :(得分: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 ;