show grants 显示当前用户显式授予的权限,不包含隐式继承、角色间接权限或系统默认权限;mysql 8.0+ 启用角色后需加 for current_user 或指定完整 'user'@'host' 才能准确查看,且角色权限需额外使用 using 或查询 role_edges 表获取。

SHOW GRANTS 能看到什么权限
它只显示当前登录用户(含主机部分,比如 'user'@'localhost')被显式授予的权限,不包含隐式继承、角色间接赋予或系统默认权限。如果你用的是 MySQL 8.0+ 并启用了角色(roles),SHOW GRANTS 默认不展开角色权限——得加 FOR CURRENT_USER 或指定用户才能看清实际生效权限。
执行 SHOW GRANTS 的常见错误
- 直接运行
SHOW GRANTS; 却没登录目标用户——结果是你看到的是你当前连接账户的权限,不是你想查的那个用户
- 误以为
SHOW GRANTS FOR 'user'; 就够了——MySQL 要求完整匹配用户名+主机,漏掉 @'host' 会报错 ERROR 1141 (42000): There is no such grant defined for user 'user' on host '%'
- 用 root 查普通用户权限时,忘记加引号:
SHOW GRANTS FOR myuser; → 必须写成 SHOW GRANTS FOR 'myuser'@'localhost';
MySQL 8.0+ 角色权限要额外处理
SHOW GRANTS; 却没登录目标用户——结果是你看到的是你当前连接账户的权限,不是你想查的那个用户SHOW GRANTS FOR 'user'; 就够了——MySQL 要求完整匹配用户名+主机,漏掉 @'host' 会报错 ERROR 1141 (42000): There is no such grant defined for user 'user' on host '%'
SHOW GRANTS FOR myuser; → 必须写成 SHOW GRANTS FOR 'myuser'@'localhost';
角色启用后,用户权限可能是通过 SET DEFAULT ROLE 或登录时激活的。此时 SHOW GRANTS 不自动合并角色权限。想看“最终生效权限”,得组合使用:
SHOW GRANTS FOR 'user'@'host'; SHOW GRANTS FOR 'user'@'host' USING 'role_name';
或者更直接:用 SELECT * FROM role_edges WHERE TO_HOST = 'user' AND TO_HOST = 'host'; 查角色绑定关系,再分别查角色权限。
权限显示结果里几个关键信号
-
USAGE 表示该用户仅能连接,无任何数据库级操作权限
- 出现
GRANT OPTION 意味着该用户可以再把权限转授他人——这是高危权限,生产环境应严格控制
- 如果看到
ON *.*,说明是全局权限;ON `db`.* 是库级;ON `db`.`tbl` 是表级——注意反引号是 MySQL 自动加的,不是你写的
- MySQL 8.0 开始,
CREATE USER、BACKUP_ADMIN 这类管理权限不会出现在 ON *.* 后面,而是单独列为 GRANT CREATE USER ON *.* 等形式
USAGE 表示该用户仅能连接,无任何数据库级操作权限GRANT OPTION 意味着该用户可以再把权限转授他人——这是高危权限,生产环境应严格控制ON *.*,说明是全局权限;ON `db`.* 是库级;ON `db`.`tbl` 是表级——注意反引号是 MySQL 自动加的,不是你写的CREATE USER、BACKUP_ADMIN 这类管理权限不会出现在 ON *.* 后面,而是单独列为 GRANT CREATE USER ON *.* 等形式权限不是静态快照,它可能随角色激活、动态授权、甚至代理用户(proxy user)机制实时变化。查完 SHOW GRANTS,最好结合 SELECT CURRENT_ROLE(); 和实际执行一条受控语句验证。











