我正在使用表前缀方法,使多个客户端使用同一个数据库。每个客户端创建的表数量将约为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上找到了它,并为了简化而复制粘贴,特此感谢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_%可以替换为适当的前缀_%。
我自己尝试了这种方法,效果很好。
_
是通配符,可以匹配任意单个字符(就像正则表达式中的.
)。使用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'