首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何赋予MySQL用户创建数据库的权限?

问如何赋予MySQL用户创建数据库的权限?
EN

Server Fault用户
提问于 2012-08-17 12:53:34
回答 2查看 1.3K关注 0票数 1

我希望让MySQL用户能够创建新的数据库,并对这些数据库拥有所有特权,但对其他数据库没有特权。我已经尝试过为这个创建一个存储过程,但是它没有起作用。这是我的程序(注意:下面的更新代码):

代码语言:javascript
复制
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 ;

我称这一程序为:

代码语言:javascript
复制
CALL createdb('newtestdb');

但是所发生的情况是创建了数据库'newdb‘(变量名)。试图以调用该过程的普通用户的身份访问该数据库也不起作用:访问被拒绝。

问:我的手术有什么问题?还是我从错误的角度来解决这个问题?

根据longneck的回答进行更新,我修改了程序如下:

代码语言:javascript
复制
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’)”调用此过程时,我得到:

代码语言:javascript
复制
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

我遗漏了什么?

EN

回答 2

Server Fault用户

回答已采纳

发布于 2012-08-17 13:10:00

这不是权利问题。mysql不支持将变量作为对象名称(其中对象是表、数据库、列等)。您必须使用准备好的语句,并将命令构建为字符串。请参阅http://forums.mysql.com/read.php?98,152150,152161#msg-152161

例如,准备语句需要如下所示:

代码语言:javascript
复制
PREPARE stmt1 FROM concat("CREATE DATABASE ", @dbname);
PREPARE stmt2 FROM concat("GRANT ALL ON newdb.* TO ", @username);

这并不是说这里不安全注射。在使用这些语句之前,一定要对“参数”(数据库名、用户名)进行消毒。

而且,你的特权是错误的。TO '@newdbuser'将该权限分配给从一台名为newdbuser的计算机连接的用户。您需要将@签名放在用户名后面。

票数 0
EN

Server Fault用户

发布于 2012-08-17 20:17:31

没有创建数据库这样的特权。只有创建权限才授予创建数据库、表和索引的权限。

票数 1
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/418581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档