我有一个 mysql 用户,我想授予他对 db 架构的所有 READ 权限。
一种方法是这样的:
GRANT SELECT, SHOW_VIEW ON test.* TO 'readuser'@'%';
有没有办法在 grant 中对所有读取操作进行分组?
最佳答案
If there is any single privilege that stands for ALL READ operations on database.
这取决于您如何定义“全部阅读”。
从表和 View 中“读取”是 SELECT
权限。如果这就是您所说的“全部阅读”,那么是的:
GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';
但是,听起来您的意思是“看”一切,“看但不摸”的能力。所以,下面是我想到的其他类型的阅读:
“阅读” View 的定义是SHOW VIEW
权限。
“读取”其他用户当前正在执行的查询列表是 PROCESS
权限。
“读取”当前复制状态是 REPLICATION CLIENT
权限。
请注意,根据相关用户的性质,任何或所有这些可能会暴露比您打算暴露的更多的信息。
如果这是您想要阅读的内容,您可以将其中任何一个(或 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
语句和/或直接操作授权表本身。
在 this recent question on Database Administrators ,发布者希望非特权用户能够修改其他用户,这当然不是通常可以做到的事情——可以修改其他用户的用户,几乎按照定义,不是非特权用户——但是—— - 存储过程在这种情况下提供了一个很好的解决方案,因为它们在其 DEFINER
用户的安全上下文中运行,允许任何具有该过程的 EXECUTE
特权的人临时承担升级的特权允许他们做程序完成的具体事情。
关于mysql - 如何授予用户只读权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20036547/