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

q7solyqu  于 2023-04-28  发布在  Mysql
关注(0)|答案(5)|浏览(162)

我使用表前缀方法让多个客户端使用同一个数据库。每个客户端创建的表数大约为55。除了通过手动列出表来完成所有的授权,我可以做一些类似下面的事情吗?

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

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_%可以替换为适当的前缀_%
我自己试过这个,效果很好。

flseospp

flseospp2#

我不确定你是否可以通配符表名,但你肯定可以通配符数据库名称。请注意,因为_是匹配任何单个字符的通配符(如正则表达式中的.)。
文档在这里:http://dev.mysql.com/doc/refman/5.5/en/grant.html
在授予全局或数据库级别权限的GRANT语句中指定数据库名称时,允许使用“”和“%”通配符。这意味着,例如,如果您想使用“”字符作为数据库名称的一部分,您应该在GRANT语句中将其指定为“_”,以防止用户能够访问与通配符模式匹配的其他数据库;例如,GRANT。..在foo\_bar上。* 致...

uplii1fm

uplii1fm3#

使用bash:

mysql -Ne "show tables from test like 'foo_%'" | xargs -I {} mysql -Ne "GRANT SELECT ON test.{} TO 'foouser'@'%'"
wz8daaqr

wz8daaqr4#

以下
GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'
工作正常(使用MySQL 5测试)。6.12(在Windows上)

1sbrub3j

1sbrub3j5#

这是一个两步火箭,首先找到所有的表,然后更新。但我给每个学生都取了不同的表名例如things_1。. things_100,并希望对所有它们运行查询。.
以下查询不起作用,是否有一种方法可以只使用一个查询?

delete from things_%;
update things_% set enabled=0;

相关问题