存储过程代码:
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'
答案 0 :(得分:3)
不幸的是,在CREATE USER
或GRANT
语句中将存储过程输入参数用作密码为documented in this bug,因为不支持。所以你实际上无法做你想做的事。
PREPARE
和EXECUTE
可以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 ;