MySql:授予只读选项?


97

我有一个用户,我想授予该用户对数据库模式的所有READ权限。

一种方法是:

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

有没有一种方法可以将所有读取操作归为Grant?


特权是SHOW VIEW,不是SHOW_VIEW,但是您无需将其授予用户,除非您希望他们能够SHOW CREATE VIEW在视图上...他们可以从视图中选择唯一的SELECT特权。“将所有读取操作归为授予”是什么意思?
Michael-sqlbot

是否有任何特权代表对数据库的所有读取操作。我知道它们提供了细粒度的访问,但是方便的高级抽象将对我们有所帮助。
Ajeet Ganga

Answers:


161

是否有任何特权代表对数据库的所有读取操作。

这取决于您如何定义“全部阅读”。

从表和视图中“读取”是SELECT特权。如果这就是“全部阅读”的意思,那么可以:

GRANT SELECT ON *.* TO 'username'@'host_or_wildcard' IDENTIFIED BY 'password';

但是,听起来您的意思是一种“看到”所有东西,“看起来却不触摸”的能力。因此,这是我想到的其他阅读类型:

“阅读”视图的定义是SHOW VIEW特权。

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

“读取”当前复制状态是REPLICATION CLIENT特权。

请注意,根据相关用户的性质,所有这些信息中的任何一个或全部可能会提供比您打算公开的信息更多的信息。

如果这是您想要做的阅读,则可以将所有这些(或任何其他可用特权)组合在一个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对过程有特权的任何人都可以临时承担提升的特权,以允许他们执行特定的操作。程序完成。


1
谢谢。除了很好的答案,我还喜欢您的密码。:)
Ajeet Ganga 2015年

2
值得注意的是:PROCESS和REPLICATION CLIENT是“全局”特权类型,因此在使用“每个数据库”排除定义时,语法将失败。mydb。*上的GRANT PROCESS ON无效,但是*。*上的GRANT PROCESS ON可以。
蜜蜂凯

db_name上的GRANT选择。*使用GRANT选项可以'demo'@'%';
穆萨


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

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

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

我发现这篇文章很有帮助


3

我在这里找到了逐步指南。

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

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

mysql -u root -p

输入根帐户的密码。在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

3

甚至用户也得到了答案,并且@Michael-sqlbot在他的帖子中已经很好地涵盖了大部分要点,但是缺少了要点,所以只是尝试掩盖它。

如果您想向简单用户提供读取权限(不是admin类型的用户),

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

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

将localhost替换为用户将从中连接到数据库的特定IP。

其他读取权限为-

  • SHOW VIEW:如果要显示视图架构。
  • REPLICATION CLIENT:如果用户需要检查复制/从属状态。但是需要在所有数据库上授予权限。
  • 过程:如果用户需要检查运行过程。仅适用于所有数据库。

0

如果要在授予读取权限后仅使视图只读,则可以在视图DDL定义中使用ALGORITHM = TEMPTABLE。


0

请注意,MySQL 8有所不同

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

CREATE USER 'readonly_user'@'localhost' IDENTIFIED BY 'some_strong_password';
GRANT SELECT, SHOW VIEW ON *.* TO 'readonly_user'@'localhost';
flush privileges;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.