MySQL含自定义函数的视图预处理查询报权限错误但直接查询正常
问题结论
这是MySQL 8.0系列的已知BUG,既不是设计规则要求,也和服务器参数配置无关。
根因说明
MySQL PREPARE/EXECUTE 预处理语句的权限校验逻辑存在疏漏:处理嵌套了DEFINER属性自定义函数的视图时,预处理阶段错误使用当前连接用户的权限校验函数内部引用的视图权限,没有正确继承使用函数的DEFINER权限执行校验,因此触发Error Code: 1356报错。
普通直接查询的权限校验逻辑完全符合官方文档规则,会逐层正确继承DEFINER的权限,所以可以正常执行。
受影响及修复版本
- 已确认受影响版本:8.0.22、8.0.27
- 该BUG已在8.0.32版本被官方修复,将MySQL升级到8.0.32及以上稳定版本即可彻底解决问题。
临时规避方案(暂无法升级时可采用)
- 将自定义函数内部引用的视图替换为直接查询基表,你补充的测试结果也验证了该方案可同时兼容普通查询和预处理查询场景
- 把需要通过预处理执行的查询逻辑改造为
SQL SECURITY DEFINER属性的存储过程,用调用存储过程的方式替代直接执行预处理语句
内容的提问来源于stack exchange,提问作者salatinator
相关产品推荐
相关产品推荐

