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 服务器版本相对应的手册,以获取在 '_Password 附近使用的正确语法;GRANT SELECT, UPDATE, DELETE, INSERT ON 'pr' 在第 6 行

请帮帮我。

4

2 回答 2

4

不幸的是,在此错误中将存储过程输入参数用作CREATE USERorGRANT语句中的密码记录为不支持。所以你实际上不能做你尝试的事情。

可以使用一个语句PREPARE来连接新密码,但这不是一种安全的方法,因此不推荐使用。如果您这样做,您将失去存储过程的所有安全优势。EXECUTECONCAT()

于 2012-07-06T20:06:58.487 回答
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 ;
于 2018-07-17T23:28:02.830 回答