如何精确设置MySQL用户只能调用特定存储过程的权限?
- 内容介绍
- 文章标签
- 相关推荐
本文共计914个文字,预计阅读时间需要4分钟。
仅能执行特定存储过程,需精确到库名.过程名,不能使用通配符,也不能依赖数据库级别的权限携带。
为什么 GRANT EXECUTE ON mydb.* 对存储过程无效
MySQL 的 EXECUTE 权限不支持数据库级通配授权。写成 GRANT EXECUTE ON mydb.* TO 'u'@'%' 会被 MySQL 忽略——它只认具体过程名。常见错误是误以为和 SELECT 权限一样能批量授权,结果 CALL 仍报 ERROR 1370 (42000): execute command denied。
必须显式指定:
GRANT EXECUTE ON PROCEDURE mydb.proc_a TO 'u'@'%'GRANT EXECUTE ON PROCEDURE mydb.proc_b TO 'u'@'%'
如果过程在 mysql 系统库下,普通用户默认无权调用,也不建议把业务过程放那里。
SQL SECURITY INVOKER 是限制执行边界的真正开关
光有 EXECUTE 权限还不够:过程内部的 SQL(比如 SELECT FROM orders)是否能跑通,取决于 SQL SECURITY 设置。默认是 DEFINER,意味着过程以创建者身份查表——这等于变相提权。
本文共计914个文字,预计阅读时间需要4分钟。
仅能执行特定存储过程,需精确到库名.过程名,不能使用通配符,也不能依赖数据库级别的权限携带。
为什么 GRANT EXECUTE ON mydb.* 对存储过程无效
MySQL 的 EXECUTE 权限不支持数据库级通配授权。写成 GRANT EXECUTE ON mydb.* TO 'u'@'%' 会被 MySQL 忽略——它只认具体过程名。常见错误是误以为和 SELECT 权限一样能批量授权,结果 CALL 仍报 ERROR 1370 (42000): execute command denied。
必须显式指定:
GRANT EXECUTE ON PROCEDURE mydb.proc_a TO 'u'@'%'GRANT EXECUTE ON PROCEDURE mydb.proc_b TO 'u'@'%'
如果过程在 mysql 系统库下,普通用户默认无权调用,也不建议把业务过程放那里。
SQL SECURITY INVOKER 是限制执行边界的真正开关
光有 EXECUTE 权限还不够:过程内部的 SQL(比如 SELECT FROM orders)是否能跑通,取决于 SQL SECURITY 设置。默认是 DEFINER,意味着过程以创建者身份查表——这等于变相提权。

