如何精确设置MySQL用户只能调用特定存储过程的权限?

2026-04-30 13:591阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计914个文字,预计阅读时间需要4分钟。

如何精确设置MySQL用户只能调用特定存储过程的权限?

仅能执行特定存储过程,需精确到库名.过程名,不能使用通配符,也不能依赖数据库级别的权限携带。

为什么 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,意味着过程以创建者身份查表——这等于变相提权。

阅读全文
标签:Mysql

本文共计914个文字,预计阅读时间需要4分钟。

如何精确设置MySQL用户只能调用特定存储过程的权限?

仅能执行特定存储过程,需精确到库名.过程名,不能使用通配符,也不能依赖数据库级别的权限携带。

为什么 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,意味着过程以创建者身份查表——这等于变相提权。

阅读全文
标签:Mysql