SHOW GRANTS 是查看当前用户权限最快速可靠的方式,直接执行即可返回可读的授权语句;查他人权限须指定完整 'user'@'host';系统表 mysql.user 仅存全局权限,多层权限需联合 mysql.db、mysql.tables_priv 等表及角色表综合判断。

直接执行 SHOW GRANTS 就能看到当前权限
这是最快速、最可靠的方式——只要能连上 MySQL,不需要额外权限就能查自己。登录后直接敲:
SHOW GRANTS;立刻返回一串可执行的授权语句,比如
GRANT SELECT, INSERT ON `appdb`.* TO 'api'@'%',含义一目了然。它不依赖你有没有
SELECT 权限去查 mysql 系统库,也不受表结构变更影响。等价写法还有 SHOW GRANTS FOR CURRENT_USER; 或 SHOW GRANTS FOR CURRENT_USER();,效果完全一样。
查别人权限必须写全 'user'@'host',漏掉 @'host' 会报错
想看其他用户的权限?不能只写用户名。例如 SHOW GRANTS FOR 'admin'; 会直接报错:ERROR 1141 (42000): There is no such grant defined for user 'admin' on host '%'。
常见错误场景包括:
- 误以为
'admin'和'admin'@'localhost'是同一个用户 - 记不清用户是用
'%'还是'192.168.1.%'创建的 - 用图形工具导出用户时没注意 Host 字段
SELECT User, Host FROM mysql.user WHERE User = 'admin';再带完整主机名执行:
SHOW GRANTS FOR 'admin'@'localhost';从 mysql.user 表查全局权限更适合批量审计
当你需要判断“所有用户是否都禁用了 DROP”或“哪些账号开了 SUPER”,SHOW GRANTS 的文本解析就太麻烦了。这时候直接查系统表更稳:
SELECT User, Host, Drop_priv, Super_priv, Grant_priv FROM mysql.user;
Drop_priv 值为 'Y' 表示有删除库/表权限,'N' 表示没有。但注意:
- 这个表只存全局权限(如
SELECT_priv),不体现数据库级(mysql.db)、表级(mysql.tables_priv)甚至列级权限 - MySQL 8.0+ 启用角色(role)后,角色继承的权限不会出现在这里,得额外查
mysql.role_edges - 手动 UPDATE 过系统表后,记得
FLUSH PRIVILEGES;,否则可能不生效
权限来源不止一个表,漏查就可能误判真实能力
MySQL 权限是分层叠加的:全局 → 数据库 → 表 → 列 → 存储过程 → 代理用户(mysql.proxies_priv)。一个用户在 mysql.user 里 Select_priv='N',却可能在 mysql.db 里对某个库有 Select_priv='Y',实际照样能查。
所以如果要做权限合规检查或故障排查,不能只盯一个表。典型组合查询包括:
- 数据库级:
SELECT * FROM mysql.db WHERE User = 'xxx'; - 表级:
SELECT * FROM mysql.tables_priv WHERE User = 'xxx'; - 角色关联(MySQL 8.0+):
SELECT * FROM mysql.role_edges WHERE FROM_HOST = '%' AND FROM_USER = 'xxx';










