If there is any single privilege that stands for ALL READ operations on database.
这取决于你如何定义“所有读”。
从表和视图中“读取”是SELECT特权。如果这是你的意思是“所有读”,然后是:
GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';
然而,它听起来像你的意思是“看到”一切,“看起来但不触摸”的能力。所以,这里是其他种类的阅读,请记住:
“读取”视图的定义是SHOW VIEW权限。
“读取”其他用户当前正在执行的查询的列表是PROCESS权限。
“读取”当前复制状态是REPLICATION CLIENT权限。
请注意,任何或所有这些可能会暴露更多的信息,而不是您打算公开,这取决于相关用户的性质。
如果这是你想要做的阅读,你可以在一个GRANT语句中结合任何这些(或任何其他the available privileges)。
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特权的人临时承担升级的权限,以允许他们完成过程完成的特定事情。