MySQL 执行过程中的两步权限检查的不同

SQL 语句执行过程中的两步权限检查的不同

author: he xiaodong date: 2019-11-26

文章源自梦康群友 lemon 的一个问题 文章中的文档参考的 8.0 版本

问题截图:权限检查来自哪一步?

题主的测试场景是:是 k 字段不存在,也没有 select 权限,看先抛出哪个错误,结果是抛出了权限不足的错误。是在执行阶段进行细粒度的权限检查,没有打开表的权限,也就无法确定 k 字段是否存在。这块翻了半天文档没发现官方给出直接的结论。

官方文档 事件权限部分 有这样的一个举例:

CREATE EVENT e_store_ts
    ON SCHEDULE
      EVERY 10 SECOND
    DO
      INSERT INTO myschema.mytable VALUES (UNIX_TIMESTAMP());

假定用户有 event 权限和 select 权限,没有 insert 权限,事件最终没有起作用,报错信息先是 INSERT command denied to user 再是 event execution failed.,可以确定权限不是在连接器或分析器阶段检查的,如果在那个阶段检查,整条 SQL 都不会执行。另一个角度想,如果在连接器上检查细粒度权限,需要做部分分析器的工作,将 SQL 拆解,查询字段和表权限进行校验,违背了单一职责原则。在分析器中检查的话,分析器的职责对于检查事件,触发器等权限来说,有些越界。在执行器阶段进行细粒度检查,是最佳的选择。

极客时间 SQL 执行流程图

对于流传甚广的上图(图源极客时间 MySQL实战45讲专栏,侵权再删除),不深究细节的话会以为表和字段等权限都在连接器中检查的,这样直接返回。实际是:MySQL 连接器层面的权限检查主要是对用户认证和连接访问数据库权限的检查,对于表,字段及触发器,事件等其他的操作,会在细致的执行阶段进行权限检查

额外说明: 细粒度的检查是涉及到表的操作才会检查,例如 select 1+1; 这样的 SQL,没有涉及表的操作,没有 select 权限也可以执行,而对于 update、delete 操作,不仅要有对应权限还需要有 select 权限。具体可以参考文档 MySQL 提供的权限部分

© 原创文章,如有错误的地方欢迎联系 hexiaodong1992@outlook.com 探讨

最后恰饭 阿里云全系列产品/短信包特惠购买 中小企业上云最佳选择 阿里云内部优惠券