一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

如何撤销用户对MySQL存储过程的执行权限

时间:2026-09-01 13:25:49 编辑:袖梨 来源:一聚教程网

必须写全数据库名和PROCEDURE关键字,正确语法为REVOKE EXECUTE ON PROCEDURE mydb.get_employee_info FROM 'user'@'host';省略库名或关键字均报错,且需确保host完全匹配、过程名大小写准确。

REVOKE EXECUTE ON PROCEDURE 语法必须带数据库名

直接写 REVOKE EXECUTE ON get_employee_info FROM 'user'@'host' 会报错,MySQL 要求存储过程权限必须明确指定数据库上下文。省略库名时,语句会被解析为全局级权限,而 EXECUTE 对存储过程不支持全局粒度。

正确写法是:REVOKE EXECUTE ON PROCEDURE mydb.get_employee_info FROM 'user'@'host'。其中 mydb 是该存储过程实际创建所在的数据库名,不能填 * 或留空。

  1. 如果过程在 test 库里,就必须写 test.get_employee_info
  2. PROCEDURE 关键字不可省略,写成 ON get_employee_info 会触发语法错误
  3. 用户 host 部分必须完全匹配授权时的值(如 'user'@'10.0.0.%''user'@'%'

撤销后需 FLUSH PRIVILEGES 才生效吗?

多数情况下不需要。MySQL 8.0+ 和 5.7 后期版本中,REVOKE 语句执行成功即刻生效,权限表(mysql.procs_priv)已同步更新。

但以下两种情况仍需手动刷新:

  1. 使用了旧版 MySQL(如 5.6 或更早),且未启用动态权限加载机制
  2. 撤销的是通过 GRANT ... WITH GRANT OPTION 授出的权限链,下游用户的缓存可能未及时失效

稳妥起见,可追加 FLUSH PRIVILEGES,但不是必须步骤;更推荐用 SHOW GRANTS FOR 'user'@'host' 立即验证结果。

撤销权限失败的常见错误现象

执行 REVOKE 后提示 ERROR 1142 (42000): EXECUTE command denied to user,通常不是权限不足,而是当前会话用户没权限操作 mysql 系统库或 procs_priv 表。

真正容易卡住的点:

  1. user 不存在或 host 不匹配 —— 先查 SELECT user, host FROM mysql.user WHERE user = 'xxx'
  2. 存储过程名拼写错误或大小写不一致(Linux 下文件系统敏感,过程名也区分大小写)
  3. 目标过程根本不在指定库中 —— 用 SELECT db, name FROM mysql.proc WHERE name = 'get_employee_info' 确认归属
  4. 用户有 EXECUTE 权限但来自 GRANT OPTION 继承,此时需先 revoke 上游再 revoke 当前

撤销后调用存储过程仍成功?检查权限继承路径

即使显式 REVOKE EXECUTE ON PROCEDURE mydb.p1 FROM 'u'@'%',用户仍可能执行成功,原因往往是权限来自更高层级:

  1. 该用户拥有 EXECUTE 全局权限(GRANT EXECUTE ON *.* TO ...
  2. 该用户属于某个角色(role),而角色被授予了 EXECUTE 权限
  3. 该用户对整个 mydb 数据库有 EXECUTE 权限(GRANT EXECUTE ON mydb.* TO ...

查清真实来源:运行 SHOW GRANTS FOR 'u'@'%',逐条核对输出中是否含更宽泛的 EXECUTE 授权项。只撤单一过程权限,挡不住“面”级或“体”级授权。

热门栏目