我有一个用户,我想授予该用户对数据库模式的所有READ权限。
一种方法是这样的:
GRANT SELECT, SHOW_VIEW ON test.* TO 'readuser'@'%';
有没有一种方法可以将所有读取操作归类到Grant中?
如果有任何单一特权代表对数据库的所有读取操作。
这取决于您如何定义“全部阅读”。
从表和视图中“读取”是SELECT特权。如果这就是“全部阅读”的意思,那么可以:
SELECT
GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';
但是,听起来您的意思是一种“看到”一切,“看起来而不是触摸”的能力。因此,这是我想到的其他阅读类型:
“阅读”视图的定义是SHOW VIEW特权。
SHOW VIEW
该PROCESS特权是“读取”其他用户当前正在执行的查询的列表。
PROCESS
“读取”当前复制状态是REPLICATION CLIENT特权。
REPLICATION CLIENT
请注意,取决于所讨论的用户的性质,所有这些信息中的任何一个或全部可能会提供比您打算公开的信息更多的信息。
如果这是您想要做的阅读,则可以将所有这些(或任何其他可用特权)组合在一个GRANT语句中。
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创建新用户的可重用语句。
其中,如果您希望单个操作来设置并向用户授予有限的特权集,并可能删除任何未获利用的特权,则可以通过创建一个封装了您想做的所有事情的存储过程来完成。在该过程的主体内,您将GRANT使用动态SQL构建语句和/或直接操纵授权表本身。
在最近有关数据库管理员的问题中,发布者希望有一个无特权的用户修改其他用户的能力,这当然是通常无法完成的事情- 可以修改其他用户的用户在定义上几乎不是无特权的用户-但是- 在这种情况下,存储过程提供了一个很好的解决方案,因为它们在其DEFINER用户的安全上下文中运行,从而使EXECUTE对过程有特权的任何人都可以临时承担提升的特权,以允许他们执行特定的操作。程序完成。
DEFINER
EXECUTE