授予具有特定前缀的多个表的权限

时间:2011-05-04 17:01:12

标签: mysql database grant database-permissions

我正在使用表前缀方法让多个客户端使用相同的数据库。每个客户端创建的表数量约为55。而不是通过手动列出表来完成所有授权,我可以执行以下操作吗?

GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';

4 个答案:

答案 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测试)