我希望让MySQL用户能够创建新的数据库,并对这些数据库拥有所有特权,但对其他数据库没有特权。我已经尝试过为这个创建一个存储过程,但是它没有起作用。这是我的程序(注意:下面的更新代码):
DELIMITER //
CREATE DEFINER = 'root'@'localhost' PROCEDURE createdb(IN newdb VARCHAR(255))
BEGIN
CREATE DATABASE newdb;
SET @newdbuser = USER();
GRANT ALL ON newdb.* TO '@newdbuser';
FLUSH PRIVILEGES;
END //
DELIMITER ;我称这一程序为:
CALL createdb('newtestdb');但是所发生的情况是创建了数据库'newdb‘(变量名)。试图以调用该过程的普通用户的身份访问该数据库也不起作用:访问被拒绝。
问:我的手术有什么问题?还是我从错误的角度来解决这个问题?
根据longneck的回答进行更新,我修改了程序如下:
DELIMITER //
CREATE DEFINER = 'root'@'localhost' PROCEDURE createdb(IN newdb VARCHAR(255))
BEGIN
PREPARE stmt1 FROM "CREATE DATABASE ?";
PREPARE stmt2 FROM "GRANT ALL ON newdb.* TO '?'";
EXECUTE stmt1 USING @newdb;
SET @newdbuser = USER();
EXECUTE stmt2 USING @newdbuser;
FLUSH PRIVILEGES;
END //
DELIMITER ;但是,当使用“调用createdb(‘this’)”调用此过程时,我得到:
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '?' at line 1我遗漏了什么?
发布于 2012-08-17 13:10:00
这不是权利问题。mysql不支持将变量作为对象名称(其中对象是表、数据库、列等)。您必须使用准备好的语句,并将命令构建为字符串。请参阅http://forums.mysql.com/read.php?98,152150,152161#msg-152161
例如,准备语句需要如下所示:
PREPARE stmt1 FROM concat("CREATE DATABASE ", @dbname);
PREPARE stmt2 FROM concat("GRANT ALL ON newdb.* TO ", @username);这并不是说这里不安全注射。在使用这些语句之前,一定要对“参数”(数据库名、用户名)进行消毒。
而且,你的特权是错误的。TO '@newdbuser'将该权限分配给从一台名为newdbuser的计算机连接的用户。您需要将@签名放在用户名后面。
https://serverfault.com/questions/418581
复制相似问题