MySql:授予只读选项?

时间:2013-11-17 21:42:25

标签: mysql sql

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

一种方法是:

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

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

7 个答案:

答案 0 :(得分:131)

  

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

这取决于你如何定义“所有阅读。”

表和视图中的“读取”是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特权的人暂时假设升级的权限允许他们执行程序完成的特定事务。

答案 1 :(得分:13)

GRANT SELECT ON *.* TO 'user'@'localhost' IDENTIFIED BY 'password';

这将为包括Views在内的所有数据库创建一个具有SELECT权限的用户。

答案 2 :(得分:7)

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

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

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

GRANT [type of permission] ON [database name].[table name] TO ‘[username]’@'localhost’;

我发现this文章非常有用

答案 3 :(得分:3)

分步指南我发现了here

为MySQL创建只读数据库用户帐户

在UNIX提示符下,运行MySQL命令行程序,并通过键入以下命令以管理员身份登录:

mysql -u root -p

键入root帐户的密码。 在mysql提示符下,执行以下步骤之一:

要授予用户从任何主机访问数据库的权限,请键入以下命令:

grant select on database_name.* to 'read-only_user_name'@'%' identified by 'password';

如果收集器将与数据库安装在同一主机上,请键入以下命令:

grant select on database_name.* to 'read-only_user_name' identified by 'password';

此命令仅为用户提供对本地主机的数据库的只读访问权限。 如果您知道将安装收集器的主机的主机名或IP地址,请键入以下命令:

grant select on database_name.* to 'read-only_user_name'@'host_name or IP_address' identified by 'password';

主机名必须可由DNS或本地主机文件解析。 在mysql提示符下,键入以下命令:

flush privileges;

输入quit

以下是示例命令和确认消息的列表:

mysql> grant select on dbname.* to 'readonlyuser'@'%' identified 
by 'pogo$23';
Query OK, 0 rows affected (0.11 sec)
mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)
mysql> quit

答案 4 :(得分:3)

即使用户已经得到答案而且@Michael - sqlbot在他的帖子中已经很好地涵盖了一点但是缺少一点,所以只是试图掩盖它。

如果您想为简单用户提供读取权限(不是管理员类型) -

GRANT SELECT, EXECUTE ON DB_NAME.* TO 'user'@'localhost' IDENTIFIED BY 'PASSWORD';

注意:这里需要EXECUTE,因此如果存在生成报告的存储过程(只有很少的select语句),用户可以读取数据。

将localhost替换为用户将连接到DB的特定IP。

其他阅读权限为 -

  • 显示视图:如果要显示视图架构。
  • REPLICATION CLIENT:如果用户需要检查复制/从属状态。 但是需要对所有数据库给予许可。
  • PROCESS:如果用户需要检查运行过程。将与所有人合作 仅限数据库。

答案 5 :(得分:0)

如果您希望在授予读取权限后才能读取视图,则可以在查看DDL定义时使用ALGORITHM = TEMPTABLE。

答案 6 :(得分:0)

MySQL 8的注意事项有所不同

您需要分两个步骤进行操作:

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;