让MySQL用户创建数据库,但只允许访问他们自己的数据库。

61

我想让多个MySQL用户能够执行命令,例如:

CREATE DATABASE dbTest;

我还希望这些用户只能看到和访问他们自己的数据库。

我找到的都是如何由DBA创建数据库并授予特定用户此数据库权限的方法:

GRANT ALL PRIVILEGES ON dbTest.* TO 'user';

或者将所有数据库的权限授予给一个用户:

GRANT ALL PRIVILEGES ON *.* TO 'user';

但是这两个选项都不是我想要的,因为它需要具备可扩展性和安全性。

4个回答

104

您可以使用

GRANT ALL PRIVILEGES ON `testuser\_%` .  * TO 'testuser'@'%';

授予用户testuser对名称以testuser_开头的所有数据库的特权。

这允许testuser创建仅限于以testuser_开头的名称的数据库。


运行时出现错误1064...在第1行附近使用的正确语法为'* TO 'testuser'@'%''。 - Asaf
你能发布完整的查询吗? - user254875486
我注意到只有在运行 mysql -u root -e "QUERY" 时才会发生这种情况,如果你用反斜杠转义反引号,则可以正常工作。 - Asaf

26

您可以使用

GRANT ALL PRIVILEGES ON `testuser_%` . * TO 'testuser'@'%';

授予用户testuser在所有名称以testuser_开头的数据库上的权限。

编辑:我不确定这个用户是否也被允许创建数据库。

是的,这将允许testuser创建仅限于以testuser_开头的名称的数据库。


2
我不得不在testuser_%周围加上反引号,但不幸的是,在stackoverflow中,这些反引号不会被识别为代码部分。 - Programster
8
这应该是对Lex回答的评论,而不是一个独立的回答。 - Drew Hammond
我不确定这个用户现在是否被允许创建数据库... 不,它不是。 - sitilge

17

使用SQL SECURITY DEFINER创建由管理员用户定义并以管理员用户特权调用的存储过程。在存储过程中,

  • 创建数据库。
  • 设置数据库权限,以便仅当前用户可以访问。
  • 执行FLUSH PRIVILEGES以从授权表中重新加载权限。

使用USER()获取当前用户登录详细信息。

了解有关SQL SECURITY DEFINER的更多信息


2
在哪里创建存储过程?这个存储过程存在于哪个数据库中? - Nest

1

仅使用权限是不可能做到这一点的。

另一个答案中建议的解决方法是: GRANT ALL PRIVILEGES ONtestuser_%. * TO 'testuser'@'%'; 但这种方法存在问题,因为用户在命名数据库时必须非常小心。

例如,如果用户aaa创建了数据库bbb_xyz,那么它只能被用户bbb独占访问,而不能被用户aaa访问。


我不明白你的意思...用户aaa将无法创建一个名为bbb_xyz的数据库,只能创建一个名为aaa_xyz的数据库。 - Jack_Hu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接