
直接执行 SHOW GRANTS 就能看到当前用户权限
这是最简单、最可靠的方式——只要你连得上 MySQL,不需要任何额外权限就能立刻看到自己被授予了什么。SHOW GRANTS 输出的是可执行的授权语句,比如 GRANT SELECT, INSERT ON `appdb`.* TO 'webuser'@'%',一目了然,不用再拼接或推理。
- 等价写法还有
SHOW GRANTS FOR CURRENT_USER或SHOW GRANTS FOR CURRENT_USER(),效果完全一样 - 它不依赖你有没有
SELECT权限去查mysql.user表,也不怕字段名记错 - 注意:MySQL 8.0+ 启用角色(role)后,
SHOW GRANTS默认不显示“通过角色继承来的权限”,只显示显式授予的权限——这点很容易漏看
查别人权限必须写全 'username'@'host'
想看其他用户的权限?光写用户名会报错:ERROR 1141 (42000): There is no such grant defined for user 'xxx' on host '%'。MySQL 把 'user'@'localhost' 和 'user'@'%' 当作两个完全不同的账号,缺一不可。
- 先确认目标用户的完整定义:
SELECT User, Host FROM mysql.user WHERE User = 'api_user'; - 再执行:
SHOW GRANTS FOR 'api_user'@'%'(不是'api_user',也不是'api_user'@'localhost') - 如果你没被授予
SELECT权限在mysql库,或者没有GRANT OPTION,这条命令会被拒绝——不是语法错,是权限不足
查系统表才能看清“全局权限开关”和批量判断逻辑
SHOW GRANTS 看起来直观,但它的输出是“授权语句的汇总结果”,没法快速回答“这个用户能不能执行 DROP DATABASE?”这种问题。这时候得直奔底层字段。
- 全局权限(如
DROP、SUPER、SHUTDOWN)存在mysql.user表里,对应字段是Drop_priv、Super_priv、Shutdown_priv,值为'Y'或'N' - 数据库级权限(如
GRANT SELECT ON mydb.*)查mysql.db;表级权限查mysql.tables_priv;列级权限查mysql.columns_priv - 手动改过系统表?记得执行
FLUSH PRIVILEGES,否则变更不生效(用GRANT语句则自动刷新)
权限查出来却发现“明明有 SELECT 却查不了表”?检查作用域和角色继承
常见现象:执行 SHOW GRANTS 显示 GRANT SELECT ON `sales`.*,但连 USE sales; 都报 Access denied。原因往往不在权限本身,而在作用域匹配或角色链断裂。
- 确认当前连接用的用户名和 host 是否与授权语句中的一致——比如你是用
mysql -u app -h 10.0.1.5连的,那必须有'app'@'10.0.1.5'或'app'@'%'的记录 - MySQL 8.0+ 开启角色后,如果用户被赋予了角色(如
SET DEFAULT ROLE 'analyst' TO 'reporter'@'%'),但没激活(SET ROLE 'analyst'),那些角色里的权限就不会生效 -
USAGE权限看起来像占位符,但它代表“零权限”——如果SHOW GRANTS只返回GRANT USAGE ON *.*,说明该用户目前实际没有任何操作权
查权限本身不难,难的是把 SHOW GRANTS、系统表字段、角色状态、连接上下文这四层对齐——少看一层,就容易以为权限给了,其实没生效。










