MySQL杂记select 权限范围变更史

摘要:
官方文件:https://docs.oracle.com/database/121/DBSEG/release_changes.htm#GUID-00745268-6964-4EE7-92FE-6B4B72931043所以我想给MySQL一个官方bug。您可以参考Oracle解决方案。我想用8.0版本来重现这个bug。在编写测试用例时,我发现只有select权限的用户在执行select…forupdate时出错,但select…lockingremode没有问题。看来官方已经纠正了,但只更改了update命令。但是,8.0实现将报告错误权限问题,因此建议官方更正与5.7相同,以便与5.7兼容。请参阅此处,并记住Oracle为什么创建了新的读取权限,但没有修改原始的选择权限。估计它也与之前的版本兼容,所以它害怕出现问题。我觉得Oracle的方法更友好。

前言:

在5.7版本中无意间发现,只有 select 权限的用户,是可以执行 select ... for update / select ... lock in share mode 命令的,一时想不出在什么场景下,会存在只有 select 权限的用户,需要对记录加锁操作,

复现:

---session1:
mysql> create database test_privilege;
Query OK, 1 row affected (0.01 sec)

mysql> use test_privilege
Database changed
mysql> create table t1(id int primary key);
Query OK, 0 rows affected (0.02 sec)

mysql> insert into t1 values(1),(2),(3);
Query OK, 3 rows affected (0.01 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> create user test identified by '123456';
Query OK, 0 rows affected (0.00 sec)

mysql> grant select on test_privilege.* to test;
Query OK, 0 rows affected (0.01 sec)


---session2:
mysql> begin; select * from t1 where id=2 lock in share mode;
+----+
| id |
+----+
|  2 |
+----+
1 row in set (0.00 sec)

排查过程:

怀疑是MySQL数据库的一个bug,在google一翻之后,有Oracle的DBA反馈Oracle也存在这个问题。

于是咨询了一位OCM,也没解释出所以然,不过查看Oracle bug之后,有人已经反馈在 Oracle 8.1-11.2 版本存在这个问题(DocID 1357623.1),关联增强型bug需求(BUG:6823286)

认为只有 select 权限的用户,在执行 select ... for update/ locak in share mode 时应该报错,

再google翻之后,发现Oracle 12版本中已经解决了这个问题,解决方法是添加了一个read权限,这个read 权限只有select 查询权限,没有 select ... for update/lock in share mode 权限。

官方文档:

https://docs.oracle.com/database/121/DBSEG/release_changes.htm#GUID-00745268-6964-4EE7-92FE-6B4B72931043

于是想给MySQL官方一个bug,可以参考Oracle的解决方案,

我想用8.0版本去复现bug,写测试用例时,发现只有select 权限的用户执行 select ... for update 时报错了,但 select ... lock in share mode没有问题,似乎官方已经改正了,但只改了 for update 这个命令。

报错内容:

mysql> select * from t1 where id=2 for update;
ERROR 1142 (42000): SELECT with locking clause command denied to user 'test'@'127.0.0.1' for table 't1'

根据报错内容继续查找,

找到了一个官方bug ,

https://bugs.mysql.com/bug.php?id=99101

有用户在5.7版本的时候,创建只有select权限的用户,并且会有这个用户去执行 select ... lock mode in share命令。但是8.0执行会报错权限问题,所以建议官方修正和5.7一样,以便兼容5.7

看到这里,想起来oracle为何会新建一个read权限,没有在原有的select权限上进行修改,估计也是为了兼容之前版本,怕出问题。

这个修复问题在提出5个多月后,官方在8.022版本中进行了修复,select 权限用户可以执行 select ... lock in share mode.

同时也修改了一些帮助文档,

在文档结尾处,有这样一个连接,8.0.1的特性被修改了

8.0.1 changelog entry update for WL3597:
https://dev.mysql.com/doc/relnotes/mysql/8.0/en/news-8-0-1.html

跳转到这个8.0.1 特性,看到这样一段话

SELECT ... FOR SHARE and SELECT ... FOR UPDATE statements now require the SELECT privilege and at least one of the DELETE, LOCK TABLES, or UPDATE privileges. Previously, only the SELECT privilege was required.

在8.0.1发布时,select 权限就发生了变化,不能执行select ... for update/ select ... lock in share mode

因为有人所提bug,,所以官方在8.0.22版本中修复为select 权限可以执行 select ... lock in share mode 命令,但执行 select ... for update 会报错。

个有感觉Oracle的做法更友好一些。

免责声明:文章转载自《MySQL杂记select 权限范围变更史》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇js之预解析Linux获取系统时间下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C++ MySQL编程

MySQL编程需要包含<mysql.h>头文件。该文件一般在MySQL安装目录下的include文件夹下。 包含头文件还不够,还需要包含“libmysql.lib”库,一般在lib文件夹下。 MySQL编程与Socket编程非常相似,唯一不同的是MySQL使用的是MYSQL结构体,而Socket使用的是SOCKET。因此需要先构建一个MYSQL...

10条技巧优化数据库速度

  大多数网站的内容都存在数据库里,用户通过请求来访问内容。数据库非常的快,有许多技巧能让你优化数据库的速度,使你不浪费服务器的资源。在这篇文章中,我收录了十个优化数据库速度的技巧。   1、小心设计数据库   第一个技巧也许看来理所当然,但事实上大部分数据库的问题都来自于设计不好的数据库结构。   譬如我曾经遇见过将客户端信息和支付信息储存在同一个数据库...

mysql 日期处理

mysql获取一个小时内的数据 (第一种方法)SELECT * FROM 表名 WHERE 字段名>NOW()-INTERVAL 2 HOUR; (第二种方法)SELECT * FROM 表名 WHERE 字段名 > DATE_SUB(NOW(), INTERVAL 60 MINUTE); 字符串型日期比对 select name,cdate ...

JAVA通过Map拼接SQL语句(Insert Update语句)

packagecom.lynch.erp.core.util; importjava.util.Map; importorg.apache.commons.collections.MapUtils; importorg.apache.commons.lang3.StringUtils; public classSQLUtils {...

Mysql导出逗号分隔的csv文件

     CleverCode在实际的工作中。常常须要将一些报表。或者日志数据等导出来,假设直接做页面,假设次数也不是非常多,需求也不同。所以直接导出csv文件,更加直观。 1 导出csv文件1.1 语句格式      SELECT [列名] FROM table [WHERE 语句] [order by 语句] [limit 语句]      INTO...

在Windows环境下搭建Snort+BASE入侵检测系统

操作系统: Windows 7 (service pack 1) 所需软件: 虚拟机:VirtualBox 网络数据包截取驱动程序:WinPcap 4.1.3 (WinPcap_4_1_3.exe) Windows版本的Snort安装包:Snort 2.8.6 for Win32 (Snort_2_8_6_Installer.exe) 官方认证S...