直接执行 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';真正难的不是查哪张表,而是意识到权限不是“非黑即白”的单一字段,而是多层策略叠加的结果。
