我有一个用户,我想授予他对db模式的所有读取权限.

一种方法是:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';

有没有办法将grant中的所有读取操作分组?

推荐答案

如果存在代表数据库上所有读取操作的任何单一权限.

这取决于你如何定义"全部阅读"

"阅读"表格和视图是SELECT项特权.如果这就是你所说的"全部阅读"的意思,那么是的:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

然而,听起来你指的是一种"看到"一切、"看但不摸"的能力下面是我想到的其他阅读方式:

"阅读"视图的定义是SHOW VIEW特权.

"读取"其他用户当前正在执行的查询列表是PROCESS权限.

"正在读取"当前复制状态是REPLICATION CLIENT权限.

请注意,根据用户的性质,任何或所有这些可能会expose 比您打算公开的更多的信息.

如果这是你想做的阅读,你可以将其中任何一个(或the available privileges个中的任何一个)组合在一个GRANT语句中.

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...

然而,没有一种特权可以授予其他特权的子集,这听起来像是你在问的.

如果您正在手动执行操作,并且正在寻找一种更简单的方法来执行此操作,而不需要记住您通常为某类用户授予的确切权限,那么您可以查看该语句以重新生成可比用户的权限,并对其进行更改以创建具有类似权限的新用户:

mysql> SHOW GRANTS FOR 'not_leet'@'localhost';
+------------------------------------------------------------------------------------------------------------------------------------+
| Grants for not_leet@localhost                                                                                                      |
+------------------------------------------------------------------------------------------------------------------------------------+
| GRANT SELECT, REPLICATION CLIENT ON *.* TO 'not_leet'@'localhost' IDENTIFIED BY PASSWORD '*xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx' |
+------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

更改"not_leet"和"localhost"以匹配您要添加的新用户,以及密码,将导致一个可重用的GRANT语句来创建新用户.

当然,如果您希望通过一个操作设置并向用户授予有限的权限集,或者删除任何未满足的权限,可以通过创建一个存储过程来完成,该存储过程封装了您想要执行的所有操作.在过程主体中,您可以使用动态SQL构建GRANT语句和/或直接操作grant表本身.

this recent question on Database Administrators年,海报希望一个没有特权的用户能够修改其他用户,这当然不是正常情况下可以做到的事情——一个可以修改其他用户的用户,从定义上来说,基本上不是一个没有特权的用户——然而,存储过程在这种情况下提供了一个很好的解决方案,因为它们是在DEFINER用户的安全上下文中运行的,因此允许在该过程中拥有EXECUTE权限的任何人临时承担升级权限,以允许他们执行该过程完成的特定操作.

Mysql相关问答推荐

查找关联数据库表的超集

MySQL:统计单词在单元格中出现的次数,并将数字放在bra中单词的旁边

从MySQL JSON列中检索数组中的所有答案

如何查询一行

mysql 获取每个单词的第一个字母

MySQL - 密码哈希没有预期的格式

如何用sql找出两次之间的差异

Mysql - 按周分组但从 1 开始计数

Select 同一张表中的结果数?

MySQL函数 - 如何对select查询应用多个条件

需要按总金额检索前 3 个供应商,每个类别 - 子类别

MYSQL 删除两个已知字符串之间的字符串

如何在更新表单中使用 group by?在 SQL 中

MySQL - 单词边界的正则表达式,不包括下划线(连接标点符号)

MySQL 将分组 JSON Select 转换为单个 JSON 对象

按年份范围 SQL 查询分组

SQL - 如何找到列中的最高数字?

用户 'User'@'%' 和 'User'@'localhost' 不一样吗?

使用 mysql 处理非常大的数据

MySQL更新查询与左连接和分组依据