MySQL 8.0.36中SHOW_ROUTINE权限存储在哪个系统表?
解决MySQL 8.0中SHOW_ROUTINE权限的存储位置问题
核心结论
在MySQL 8.0.36版本中,SHOW_ROUTINE全局权限存储在mysql.global_priv系统表的Privilege字段中,而非传统的mysql.user或mysql.procs_priv表。
具体查询方法
要找出拥有SHOW_ROUTINE权限的用户,直接查询mysql.global_priv表,解析JSON格式的权限字段即可:
SELECT User, Host, JSON_EXTRACT(Privilege, '$.Show_routine') AS has_show_routine FROM mysql.global_priv WHERE JSON_EXTRACT(Privilege, '$.Show_routine') = true;
或者更简洁的写法:
SELECT User, Host FROM mysql.global_priv WHERE Privilege->>'$.Show_routine' = 'true';
为什么不在mysql.user或procs_priv表?
- MySQL 8.0重构了权限系统,原
mysql.user表中的独立权限字段(如Show_routine_priv)被移除,所有全局权限统一以JSON格式存储在mysql.global_priv的Privilege字段中。 mysql.procs_priv表仅存储针对特定存储过程/函数的权限(如EXECUTE、ALTER ROUTINE等),而SHOW_ROUTINE是全局级权限,不会出现在这里。
验证权限的其他方式
除了直接查询系统表,也可以用SHOW GRANTS命令查看指定用户的权限:
SHOW GRANTS FOR 'username'@'host';
如果用户拥有全局SHOW_ROUTINE权限,输出结果会包含GRANT SHOW ROUTINE ON *.* TO 'username'@'host';
内容的提问来源于stack exchange,提问作者Aliman
相关产品推荐
相关产品推荐

