MySql:授予只读选项?

Aje*_*nga 84 mysql sql

我有一个用户,我想在db模式上授予所有READ权限.

一种方法是:

GRANT SELECT, SHOW_VIEW  ON test.* TO 'readuser'@'%';
Run Code Online (Sandbox Code Playgroud)

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

Mic*_*bot 144

如果有任何单个权限代表数据库上的所有READ操作.

这取决于你如何定义"所有阅读".

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

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';
Run Code Online (Sandbox Code Playgroud)

然而,听起来你的意思是"看到"所有东西,"看起来但不触摸"的能力.所以,这里有其他类型的阅读:脑海中浮现:

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

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

"读取"当前复制状态是REPLICATION CLIENT特权.

请注意,根据相关用户的性质,这些中的任何一个或全部可能会暴露出比您要公开的信息更多的信息.

如果这是您想要执行的读取,则可以在单个GRANT语句中组合这些(或任何其他可用权限).

GRANT SELECT, SHOW VIEW, PROCESS, REPLICATION CLIENT ON *.* TO ...
Run Code Online (Sandbox Code Playgroud)

但是,没有任何一个权限可以授予其他权限的某些子集,这就是您所要求的.

如果您正在手动执行操作并寻找更简单的方法来执行此操作而无需记住您通常为某类用户创建的确切授权,则可以查找该语句以重新生成可比较用户的授权,并更改它创建具有类似权限的新用户:

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)
Run Code Online (Sandbox Code Playgroud)

更改"not_leet"和"localhost"以匹配要添加的新用户以及密码,将生成可重用的GRANT语句以创建新用户.

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

最近关于数据库管理员的问题中,海报希望非特权用户能够修改其他用户,这当然不是通常可以做的事情 - 可以修改其他用户的用户,根据定义,不是一个无特权的用户 - 但是 - 存储过程在这种情况下提供了一个很好的解决方案,因为它们与DEFINER用户的安全上下文一起运行,允许任何拥有EXECUTE该过程特权的人临时假设升级的特权,以允许他们执行特定的事情.程序完成.

  • 谢谢。除了很好的答案,我还喜欢你的密码。:) (2认同)
  • 值得注意的是:PROCESS和REPLICATION CLIENT是“全局”特权类型,因此,在用“每个数据库”排除定义时,语法将失败。mydb。*上的GRANT PROCESS无效,但是\ *。\ *上的GRANT PROCESS可以。 (2认同)

Mah*_*til 15

GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';
Run Code Online (Sandbox Code Playgroud)

这将创建一个具有SELECT包括视图在内的所有数据库的权限的用户.


ath*_*h j 9

您可以授予用户的各种权限

ALL PRIVILEGES- This would allow a MySQL user all access to a designated database (or if no database is selected, across the system)
CREATE- allows them to create new tables or databases
DROP- allows them to them to delete tables or databases
DELETE- allows them to delete rows from tables
INSERT- allows them to insert rows into tables
SELECT- allows them to use the Select command to read through databases
UPDATE- allow them to update table rows
GRANT OPTION- allows them to grant or remove other users' privileges
Run Code Online (Sandbox Code Playgroud)

要为特定用户提供权限,您可以使用此框架:

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;
Run Code Online (Sandbox Code Playgroud)

我发现这篇文章非常有帮助


Dan*_*ick 6

注意 MySQL 8 它是不同的

您需要分两步完成:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
Run Code Online (Sandbox Code Playgroud)