我正在使用表前缀方法让多个客户端使用同一个数据库。每个客户端创建的表数约为 55。我可以执行以下操作,而不是通过手动列出表来完成所有授权?
GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';
我正在使用表前缀方法让多个客户端使用同一个数据库。每个客户端创建的表数约为 55。我可以执行以下操作,而不是通过手动列出表来完成所有授权?
GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';
提前说明:这不是我的答案。我在http://lists.mysql.com/mysql/202610找到了它,为了简单起见,我复制并粘贴了它,感谢斯蒂芬库克
您可以使用 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_% 可以替换为适当的前缀_%
我自己试过这个,效果很好。
我不确定您是否可以使用通配符表名,但您绝对可以使用通配符数据库名称。不过要注意_
匹配任何单个字符的通配符(如.
在正则表达式中)。
文档在这里:http ://dev.mysql.com/doc/refman/5.5/en/grant.html
在授予全局或数据库级别权限的 GRANT 语句中指定数据库名称时,允许使用“_”和“%”通配符。这意味着,例如,如果您想使用“_”字符作为数据库名称的一部分,则应在 GRANT 语句中将其指定为“\_”,以防止用户能够访问其他匹配的数据库通配符模式;例如,GRANT ... ON `foo\_bar`.* TO ....
使用 bash:
mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"
以下
GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'
工作正常(在 Windows 上使用 MySQL 5.6.12 测试)