当前位置: 首页 > 后端技术 > PHP

MySQL执行过程中两步权限检查的区别

时间:2023-03-29 21:00:12 PHP

原文链接:何晓东的博文来源于萌康群友柠檬的一篇提问文章中的文档参考。8.0版本问题截图:主要测试场景是:k字段不存在,没有select权限,看先抛出哪个错误,结果是权限不足的错误。它是执行阶段的细粒度权限检查。没有打开表的权限,无法判断k字段是否存在。这篇文档找了很久,没有找到官方结论。官方文档的事件权限部分有这样一个例子:CREATEEVENTe_store_tsONSCHEDULEEVERY10SECONDDOINSERTINTOmyschema.mytableVALUES(UNIX_TIMESTAMP());假设用户有event权限和select权限,没有insert权限,event最后是不行的,报错信息是先INSERTcommanddeniedtouser,然后eventexecutionfailed。可以确定是在connector或analyzer阶段没有检查权限。如果在那个阶段检查,则不会执行整个SQL。从另一个角度看,如果在connector上检查细粒度的权限,需要做analyzer的部分工作,拆解SQL,检查查询字段和表权限,违反了单一职责原则。在分析器中检查,分析器的职责对于检查事件、触发器等的权限有点越界。在执行器阶段进行细粒度检查是最好的选择。对于上面流传很广的一张图(图片来源极客时间MySQL实战45讲专栏,侵权再删),不深究会以为表和权限字段在连接器中被选中,所以你可以直接返回它。实际情况是:MySQL连接器级别的权限检查主要是检查用户身份验证和连接访问数据库权限。对于表、字段、触发器、事件等其他操作,会在详细执行阶段进行权限检查。补充说明:细粒度检查只在检查涉及表的操??作时检查,如select1+1;此类SQL不涉及表操作,无需select权限即可执行。对于更新和删除操作,不仅要有相应的权限,还需要有select权限。详情请参考MySQL提供文档权限部分?原创文章,如有错误请联系hexiaodong1992@outlook.com讨论最后起帆阿里云全系列产品/短信套餐特价购买最好的中小企业上云的选择阿里云内部优惠券