我正在使用表前缀方法让多个客户端使用相同的数据库。每个客户端创建的表数量约为55。而不是通过手动列出表来完成所有授权,我可以执行以下操作吗?
GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';
答案 0 :(得分:30)
预先注意:这不是我的答案。我在http://lists.mysql.com/mysql/202610找到了它并复制并粘贴到Stephen Cook
您可以使用INFORMATION_SCHEMA.TABLES视图生成GRANT 你的陈述。按以下方式写一个查询:
SELECT CONCAT('GRANT SELECT ON test.', TABLE_NAME, ' to ''foouser'';')
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = 'test'
AND TABLE_NAME LIKE 'foo_%'
然后运行它,复制结果,并将这些结果作为查询或运行 脚本。你当然可以随心所欲地疯狂 例如,如果您为许多用户执行此操作,则可以编写存储过程 它接受用户名的参数,因此可以用作 工具,无论何时需要它。
这不是你要求的语法,但它是一个很好的技巧。
-
将表模式'test'替换为数据库的名称。 foo_%可以用适当的前缀_%
替换我自己尝试了这个并且效果很好。
答案 1 :(得分:3)
我不确定你是否可以使用通配符表名,但你肯定可以使用通配符数据库名称。请注意,_
是匹配任何单个字符的通配符(如正则表达式中的.
)。
文件在这里:http://dev.mysql.com/doc/refman/5.5/en/grant.html
“_”和“%”通配符是 指定数据库时允许 GRANT语句中授予的名称 全局或数据库的权限 水平。这意味着,例如,那 如果你想使用“_”字符作为 你应该是数据库名称的一部分 在GRANT中将其指定为“\ _” 声明,以防止用户 能够访问其他 与通配符匹配的数据库 图案;例如,GRANT ...... ON`foo \ _bar`。* TO ....
答案 2 :(得分:0)
使用bash:
mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"
答案 3 :(得分:0)
以下
GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'
工作正常(在Windows上使用MySQL 5.6.12测试)