mysql如何查看用户权限_mysql权限查询方式

10次阅读

SHOW GRANTS 最快查看当前用户权限,输出可执行授权语句;查他人权限需指定完整 ’username’@’host’;全局权限查 mysql.user,数据库级查 mysql.db,表级查 mysql.tables_priv,角色权限需额外查 mysql.role_edges。

mysql 如何查看用户权限_mysql 权限查询方式

直接查当前用户权限:用 SHOW GRANTS 最快

登录 MySQL 后,执行 SHOW GRANTS; 就能立刻看到你当前会话用户的全部权限语句。它不依赖权限表结构,也不需要额外 SELECT 权限,只要能连上就能用。

  • 输出是可执行的授权语句(比如 GRANT SELECT, INSERT ON `testdb`.* TO 'app'@'%'),非常直观
  • 等价写法还有 SHOW GRANTS FOR CURRENT_USER;SHOW GRANTS FOR CURRENT_USER();,效果一样
  • 注意:SHOW GRANTS; 不显示“未显式授予但继承自角色”的权限(MySQL 8.0+ 角色机制下需额外查 mysql.role_edges

查其他用户权限:必须带 @'host' 才生效

想看别人权限?得把用户名和主机名配对写全,否则报错 ERROR 1141 (42000): There is no such grant defined for user 'xxx' on host '%' —— 这是最常卡住的地方。

  • 例如查远程应用用户:SHOW GRANTS FOR 'api_user'@'%';
  • 查本地管理用户:SHOW GRANTS FOR 'admin'@'localhost';
  • 如果不确定 host 是什么,先查 SELECT User, Host FROM mysql.user WHERE User = 'api_user';
  • 没有 SUPER 或 SELECT 权限在 mysql 库时,SHOW GRANTS FOR …… 会拒绝执行

查权限底层字段:看 mysql.user 表里的 _priv 列

当你要批量判断某类权限是否开启(比如确认所有用户都禁用了 DROP),直接读 mysql.user 表比解析 SHOW GRANTS 输出更可靠。

  • 关键字段如 Select_privDrop_privSuper_priv 值为 'Y''N'
  • 示例命令:
    SELECT User, Host, Select_priv, Insert_priv, Drop_priv, Super_priv FROM mysql.user WHERE User = 'backup_user'G
  • ⚠️ 注意:这些只反映全局权限,数据库 / 表 / 列级权限不在这个表里 —— 它们分别存在 mysql.dbmysql.tables_privmysql.columns_priv

细粒度权限在哪查:按 作用域 分表定位

MySQL 把权限按层级拆到不同系统表,查错表就看不到真实权限。比如给用户开了 myapp.* 的 SELECT,但在 mysql.user 里查不到这条记录。

  • 数据库级权限(如 GRANT SELECT ON myapp.*)→ 查 mysql.db
    SELECT User, Host, Db, Select_priv, Insert_priv FROM mysql.db WHERE User = 'app_user' AND Db = 'myapp';
  • 表级权限(如 GRANT UPDATE ON myapp.logs)→ 查 mysql.tables_priv
  • 列级权限(极少见,但存在)→ 查 mysql.columns_priv
  • 所有这些表修改后,记得执行 FLUSH PRIVILEGES;(仅当你手动 UPDATE 系统表时才需要;用 GRANT 语句则自动生效)

实际排查时,别只盯着一个命令或一张表。权限叠加逻辑复杂,SHOW GRANTS 是第一眼答案,mysql.user + mysql.db 组合才是真相底稿。尤其在 MySQL 8.0 启用角色后,还得加查 mysql.role_edgesmysql.proxies_priv,漏掉任一环都可能误判。

text=ZqhQzanResources