MySQL的sql语句的权限检查在执行器还是分析器阶段?

对某张表是否有权限进行查询或者更新感觉在分析器也就是在词法分析,语法分析之后就能得出吧?语法错误,表和列的错误等都应该在语法分析阶段被发现吧;

根据下面的论述
分析器
1.词法分析:从"SELECT" 识别是查询语句,把字符串“T”识别成“表名T”,把字符串“ID”识别成“列ID”
2.语法分析:根据与语法规则判断SQL语句是否满足MySQL语法
一般语法错误会提示第一个出错位置,要关注的是紧接“use near”的内容

优化器
优化器在表里有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序

执行器
1.在执行之前,判断时候有执行的权限
2.命中查询缓存,在返回结果时做权限验证
3.查询会在优化器之前调用precheck验证权限
查询或者更新权限的校验似乎在执行器阶段处理的,这个很诡异啊

阅读 5.1k
3 个回答

sql执行过程中可能会有触发器这种在运行时才能确定的过程,分析器工作结束后的precheck是不能对这种运行时涉及到的表进行权限校验的,所以需要在执行器阶段进行权限检查。

新手上路,请多包涵

我的理解是:在优化器之前和执行器中都会进行权限检查。
第一阶段precheck验证权限:
在解析器解析完后优化器之前,会调用precheck验证权限。(但是这个验证只能做简单的验证,因为有些时候,SQL语句要操作的表不只是SQL字面上那些。比如如果有个触发器,得在执行器阶段才能确定。也就是说“precheck验证权限通过不一定真的完全具有权限,但是precheck验证权限不通过则一定不具备对应的权限”)
第二阶段执行器权限验证:
在执行器过程中的权限验证是比较权威的,通过则说明有对应权限

precheck验证不通过 ==》 没有对应权限
precheck验证通过---执行器权限验证通过 ==》 具有对应权限

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏