mysql如何查看用户当前权限_mysql权限查询方法

来源:这里教程网 时间:2026-02-28 20:47:09 作者:

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

相关推荐