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

Posted

技术标签:

【中文标题】授予对具有特定前缀的多个表的权限【英文标题】:Grant privileges on several tables with specific prefix 【发布时间】:2011-08-18 17:30:38 【问题描述】:

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

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

【问题讨论】:

这很奇怪。 Here 是同一个问题,答案是肯定的。 @PavelStrakhov 我知道你的评论有点老了,但是这个问题是关于表通配符(mysql 不支持),而你的链接问题是关于数据库通配符(支持) 【参考方案1】:

提前说明:这不是我的答案。我在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_% 可以替换为适当的前缀_%

我自己试过了,效果很好。

【讨论】:

OP没有礼貌地接受这个答案,但它帮助了我+1 您为我节省了一天,先生! 糟糕的解决方案,如果您需要在很多(前缀)表上添加特定权限。 如果您只是丢失了连接在用户名周围的单引号,则同样适用于 PostgreSQL。 +1 不错的解决方案。但它不包括在授予用户权限后创建具有该前缀的新表的情况。【参考方案2】:

我不确定您是否可以使用通配符表名,但您绝对可以使用通配符数据库名。但请注意,_ 是与任何单个字符匹配的通配符(如正则表达式中的 .)。

文档在这里:http://dev.mysql.com/doc/refman/5.5/en/grant.html

“_”和“%”通配符是 指定数据库时允许 GRANT 语句中授予的名称 全局或数据库权限 水平。例如,这意味着 如果您想使用“_”字符作为 数据库名称的一部分,您应该 在 GRANT 中将其指定为“\_” 声明,以防止用户 能够访问其他 匹配通配符的数据库 图案;例如,GRANT ... ON `foo\_bar`.* TO ....

【讨论】:

似乎我们不能在表名中使用通配符【参考方案3】:

使用 bash:

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

【讨论】:

【参考方案4】:

以下

GRANT SELECT , INSERT , UPDATE , DELETE ON ``database.prefix\_%``. * TO 'username'@'localhost'

工作正常(在 Windows 上使用 MySQL 5.6.12 测试)

【讨论】:

这仅适用于动态指定数据库的名称,而不是动态指定表名,不幸的是。 这在 5.7 中不起作用。如GRANT Syntax 的文档中所述:“当数据库名称不用于授予数据库级别的权限,而是作为授予某些其他对象(例如表或例程)权限的限定符时,通配符是视为普通字符。”

以上是关于授予对具有特定前缀的多个表的权限的主要内容,如果未能解决你的问题,请参考以下文章

是否可以对具有特定前缀的资产目录中的图片进行计数?

授予特定用户对特定(多个)文档的访问权限

授予对 Postgres 中所有表的访问权限

创建基于前缀联合特定表的视图

mysql:具有授予选项和通配符的数据库特定用户权限委托

C# 授予对特定不相关类的访问权限