我使用表前缀方法让多个客户端使用同一个数据库。每个客户端创建的表数大约为55。除了通过手动列出表来完成所有的授权,我可以做一些类似下面的事情吗?
GRANT SELECT,INSERT,UPDATE,DELETE ON database.prefix_* TO 'username'@'localhost' IDENTIFIED BY 'password';
vnzz0bqm1#
预先说明:这不是我的答案。我在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_%可以替换为适当的前缀_%我自己试过这个,效果很好。
flseospp2#
我不确定你是否可以通配符表名,但你肯定可以通配符数据库名称。请注意,因为_是匹配任何单个字符的通配符(如正则表达式中的.)。文档在这里:http://dev.mysql.com/doc/refman/5.5/en/grant.html在授予全局或数据库级别权限的GRANT语句中指定数据库名称时,允许使用“”和“%”通配符。这意味着,例如,如果您想使用“”字符作为数据库名称的一部分,您应该在GRANT语句中将其指定为“_”,以防止用户能够访问与通配符模式匹配的其他数据库;例如,GRANT。..在foo\_bar上。* 致...
_
.
foo\_bar
uplii1fm3#
使用bash:
mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"
wz8daaqr4#
以下GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'工作正常(使用MySQL 5测试)。6.12(在Windows上)
GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'
1sbrub3j5#
这是一个两步火箭,首先找到所有的表,然后更新。但我给每个学生都取了不同的表名例如things_1。. things_100,并希望对所有它们运行查询。.以下查询不起作用,是否有一种方法可以只使用一个查询?
delete from things_%; update things_% set enabled=0;
5条答案
按热度按时间vnzz0bqm1#
预先说明:这不是我的答案。我在http://lists.mysql.com/mysql/202610找到了它,并复制和粘贴了Stephen Cook的简单性
您可以使用INFORMATION_SCHEMA。TABLES视图为您生成GRANT语句。沿着以下方式编写查询:
然后运行它,复制结果,并将这些结果作为查询或脚本运行。当然,你可以随心所欲地使用它,例如,如果你为许多用户这样做,也许可以编写一个存储过程,它接受用户名的参数,因此可以在需要时用作工具。
这不是你要求的语法,但这是一个很好的技巧。
用数据库的名称替换表架构“test”。foo_%可以替换为适当的前缀_%
我自己试过这个,效果很好。
flseospp2#
我不确定你是否可以通配符表名,但你肯定可以通配符数据库名称。请注意,因为
_
是匹配任何单个字符的通配符(如正则表达式中的.
)。文档在这里:http://dev.mysql.com/doc/refman/5.5/en/grant.html
在授予全局或数据库级别权限的GRANT语句中指定数据库名称时,允许使用“”和“%”通配符。这意味着,例如,如果您想使用“”字符作为数据库名称的一部分,您应该在GRANT语句中将其指定为“_”,以防止用户能够访问与通配符模式匹配的其他数据库;例如,GRANT。..在
foo\_bar
上。* 致...uplii1fm3#
使用bash:
wz8daaqr4#
以下
GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'
工作正常(使用MySQL 5测试)。6.12(在Windows上)
1sbrub3j5#
这是一个两步火箭,首先找到所有的表,然后更新。但我给每个学生都取了不同的表名例如things_1。. things_100,并希望对所有它们运行查询。.
以下查询不起作用,是否有一种方法可以只使用一个查询?