必须写全数据库名和PROCEDURE关键字,正确语法为REVOKE EXECUTE ON PROCEDURE mydb.get_employee_info FROM 'user'@'host';省略库名或关键字均报错,且需确保host完全匹配、过程名大小写准确。
直接写 REVOKE EXECUTE ON get_employee_info FROM 'user'@'host' 会报错,MySQL 要求存储过程权限必须明确指定数据库上下文。省略库名时,语句会被解析为全局级权限,而 EXECUTE 对存储过程不支持全局粒度。
正确写法是:REVOKE EXECUTE ON PROCEDURE mydb.get_employee_info FROM 'user'@'host'。其中 mydb 是该存储过程实际创建所在的数据库名,不能填 * 或留空。
test 库里,就必须写 test.get_employee_info
PROCEDURE 关键字不可省略,写成 ON get_employee_info 会触发语法错误'user'@'10.0.0.%' ≠ 'user'@'%')多数情况下不需要。MySQL 8.0+ 和 5.7 后期版本中,REVOKE 语句执行成功即刻生效,权限表(mysql.procs_priv)已同步更新。
但以下两种情况仍需手动刷新:
GRANT ... WITH GRANT OPTION 授出的权限链,下游用户的缓存可能未及时失效稳妥起见,可追加 FLUSH PRIVILEGES,但不是必须步骤;更推荐用 SHOW GRANTS FOR 'user'@'host' 立即验证结果。
执行 REVOKE 后提示 ERROR 1142 (42000): EXECUTE command denied to user,通常不是权限不足,而是当前会话用户没权限操作 mysql 系统库或 procs_priv 表。
真正容易卡住的点:
user 不存在或 host 不匹配 —— 先查 SELECT user, host FROM mysql.user WHERE user = 'xxx'
SELECT db, name FROM mysql.proc WHERE name = 'get_employee_info' 确认归属EXECUTE 权限但来自 GRANT OPTION 继承,此时需先 revoke 上游再 revoke 当前即使显式 REVOKE EXECUTE ON PROCEDURE mydb.p1 FROM 'u'@'%',用户仍可能执行成功,原因往往是权限来自更高层级:
EXECUTE 全局权限(GRANT EXECUTE ON *.* TO ...)EXECUTE 权限mydb 数据库有 EXECUTE 权限(GRANT EXECUTE ON mydb.* TO ...)查清真实来源:运行 SHOW GRANTS FOR 'u'@'%',逐条核对输出中是否含更宽泛的 EXECUTE 授权项。只撤单一过程权限,挡不住“面”级或“体”级授权。
Tplink企业版路由器WiFi名称的默认设置介绍(Tplink企业版路由器WiFi名称的默认设置是什么)
Tplink路由器灯常亮无法上网的原因分析(如何解决Tplink路由器灯常亮无法上网的问题)
Tplink千兆企业级路由器自动重启的作用和优势介绍(如何设置Tplink千兆企业级路由器自动重启功能)
一根天线的tplink路由器有哪些(一根天线的Tplink路由器的特点和优势介绍)
tplink路由器外网访问不了nas(Tplink路由器外网访问NAS的原因分析)
Tplink无法搜到路由器的原因分析(如何解决Tplink无法搜到路由器的问题)