StarRocks SHOW USERS 命令详解:查看系统全部用户标识的语法、权限与源码实现
2026/9/19 8:47:54 网站建设 项目流程

StarRocks SHOW USERS 命令详解:查看系统全部用户标识的语法、权限与源码实现

【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks

导读

SHOW USERS是 StarRocks 账户管理体系中用于**列出系统中全部用户标识(User Identity)**的基础命令。与 MySQL 中的SHOW USERS语义不同,StarRocks 返回的不是单纯的用户名,而是'username'@'host'形式的完整用户标识。本文以官方文档为骨架,结合 FE 端语法定义、AST 节点、执行器与授权管理器源码,完整讲解该命令的语法、返回字段、权限要求、典型使用场景及其底层实现原理,帮助你快速掌握"查看系统里有哪些用户"这一日常运维与审计操作的完整知识。


一、命令概述:SHOW USERS 能做什么

SHOW USERS用于显示系统中所有已创建的用户。需要特别注意的是,文档明确指出:

Users mentioned here are user identities, not user names.

即该命令输出的不是单纯的用户名,而是用户标识(user_identity)。在 StarRocks 中,一个用户由user_namehost两部分共同唯一标识,格式为username@'userhost'。这意味着同一个用户名可能对应多个不同的用户标识(例如'jack'@'%''jack'@'172.10.1.10'是两个不同的用户),因此只有以用户标识为单位进行展示,才能准确反映系统的用户全貌。

关于用户标识的更多细节,可参阅 CREATE USER 文档中关于user_identity的说明:

  • user_identityuser_namehost两部分组成,格式为username@'userhost'
  • host部分可以使用%进行模糊匹配;
  • 若未指定host,默认使用%,表示该用户可以从任意主机连接 StarRocks。

该命令自 v3.0 起支持。若要查看某个具体用户被授予的权限,可配合使用SHOW GRANTS FOR <user_identity>;,详见 SHOW GRANTS。


二、权限要求:仅user_admin角色可执行

执行SHOW USERS存在严格的权限门槛。官方文档通过公共提示块明确要求:

Only users with theuser_adminrole has the privilege to perform this operation.

只有拥有user_admin内置角色的用户才有权限列出系统中的全部用户。user_admin是 StarRocks 提供的五个内置角色之一,其定位是"用户管理员",可用于管理用户、角色与授权,详见 内置角色说明。

这一点在 FE 源码中也有印证:在 AuthorizerStmtVisitor.java 的visitShowUserStatement中,当语句为"列出全部用户"形态时,会调用Authorizer.checkSystemAction(context, PrivilegeType.GRANT)进行系统级 GRANT 权限校验,未通过校验时抛出AccessDeniedException并报告访问被拒绝。可以推断,user_admin之所以能执行该命令,正是因为它具备这一系统级权限能力。

对比提示:与SHOW USERS不同,SHOW GRANTS 允许所有角色和用户查看授予自己的权限,仅查看指定用户或角色的权限时才要求user_admin


三、语法

SHOW USERS

该命令不接受任何参数、通配符或谓词,执行后一次性返回系统中全部用户标识。

在语法层,StarRocks 使用 ANTLR 文法定义该语句。在 StarRocks.g4 中可以看到:

showUserStatement : SHOW (USER | USERS) showPredicateClauses ;

SHOW USERSHOW USERS共用同一条语法规则。对应的 AST 节点为 ShowUserStmt.java,它通过一个isAll布尔标志区分两种形态:

  • SHOW USERS:列出系统中全部用户标识;
  • SHOW USER:仅显示当前会话用户自身的用户标识。

官方文档仅对SHOW USERS形态做出承诺,SHOW USER的行为属源码结构推断,可作为补充了解。


四、返回字段

FieldDescription
UserThe user identity(用户标识)。

结果集仅包含一列User,每一行是一个形如'username'@'host'的完整用户标识字符串。结合 AuthorizationMgr.java 的实现可知,该字符串由UserIdentity.toString()生成,与创建用户时所使用的user_identity表示形式一致。


五、示例

显示系统中的全部用户:

mysql> SHOW USERS; +-----------------+ | User | +-----------------+ | 'wybing5'@'%' | | 'root'@'%' | | 'admin'@'%' | | 'star'@'%' | | 'wybing_30'@'%' | | 'simo'@'%' | | 'wybing1'@'%' | | 'wybing2'@'%' | +-----------------+

从示例输出可以看出两个要点:

  1. 输出的是用户标识而非用户名:例如'wybing5'@'%''wybing1'@'%'是不同的用户标识,即使前缀相似也是完全独立的两个用户。
  2. rootadmin等内置用户也出现在列表中:系统初始化阶段创建的内置用户与其他用户一同列出,便于管理员一览全局。

六、典型实战组合:SHOW USERS + SHOW GRANTS

SHOW USERS单独使用时只提供"有哪些用户"这一层信息。在实际运维中,更完整的用户盘点流程是与权限查询命令配合使用:

  1. 盘点用户全貌
SHOW USERS;
  1. 查看指定用户的授权情况
SHOW GRANTS FOR 'wybing5'@'%';
  1. 查看当前用户的授权情况(所有用户均可执行):
SHOW GRANTS; SHOW GRANTS FOR CURRENT_USER();

SHOW GRANTS 的结果集包含UserIdentityCatalogGrants三列,其中:

  • UserIdentity:被查询的用户标识;
  • Catalog:授权发生的 catalog(内部 catalog 返回default,外部 catalog 返回其名称,角色授予场景返回NULL);
  • Grants:具体的 GRANT 语句描述。

通过SHOW USERS拿到全部用户标识后,即可逐个使用SHOW GRANTS FOR <user_identity>完成对系统内所有用户授权状况的巡检,例如排查是否存在权限过大的闲置账号。


七、源码级实现原理

SHOW USERS的完整执行链路贯穿 StarRocks FE 的语法解析、语义分析与执行三个阶段,涉及的核心文件如下:

1. 语法解析

  • 文法定义:StarRocks.g4 中的showUserStatement规则;
  • AST 节点:ShowUserStmt.java,通过isAll标志区分"全部用户"与"当前用户"两种形态。

2. 权限校验

在 AuthorizerStmtVisitor.java 的visitShowUserStatement中:

  • statement.isAll()为 true(即SHOW USERS),执行Authorizer.checkSystemAction(context, PrivilegeType.GRANT)校验系统级 GRANT 权限;
  • 校验失败时通过AccessDeniedException.reportAccessDenied报告访问被拒绝,并终止执行。

这解释了为什么只有具备user_admin角色(具备系统管理类权限)的用户才能执行本命令。

3. 结果生成

在 ShowExecutor.java 的visitShowUserStatement中:

if (statement.isAll()) { AuthorizationMgr authorizationManager = GlobalStateMgr.getCurrentState().getAuthorizationMgr(); List<String> users = authorizationManager.getAllUsers(); users.forEach(u -> rowSet.add(Lists.newArrayList(u))); } else { List<String> row = Lists.newArrayList(); row.add(context.getCurrentUserIdentity().toString()); rowSet.add(row); } return new ShowResultSet(showResultMetaFactory.getMetadata(statement), rowSet);

核心数据来源是 AuthorizationMgr.getAllUsers():该方法在读锁保护下,遍历授权管理器内存中的userToPrivilegeCollection映射(keySet 为全部UserIdentity),将每个用户标识序列化为字符串后返回。可以推断,SHOW USERS的结果实时反映 FE 内存中已加载的用户集合,用户一经CREATE USER创建即会出现在列表中,被DROP USER删除后则立即消失。


八、注意事项与常见问题

  • 区分用户与用户标识SHOW USERS输出的是user_identity,不是用户名。若只想查看当前登录用户的信息,可使用SHOW USER(或查看SHOW GRANTS的结果)。
  • 权限不足时报错:非user_admin角色执行SHOW USERS会因系统级 GRANT 权限校验失败而被拒绝,这与查看自身授权的SHOW GRANTS(所有用户可执行)形成鲜明对比。
  • 版本要求:该命令自v3.0起支持,使用前请确认集群版本。
  • 结果规模:该命令一次性返回全部用户标识,无过滤与分页参数。在用户数量庞大的集群中,输出行数等于系统中用户标识总数,可与客户端的分页/检索能力配合使用。
  • 命令无参数SHOW USERS不接受用户名、host 或 LIKE 通配符等过滤条件;如需定向查询某用户的授权,请使用SHOW GRANTS FOR <user_identity>

九、相关命令

SHOW USERS是用户生命周期管理命令族中的查询一环,与之配套的常用命令包括:

  • CREATE USER:创建用户(含认证方式、默认角色、用户属性);
  • ALTER USER:修改用户认证信息与默认角色;
  • DROP USER:删除用户;
  • SHOW GRANTS:查看用户或角色的授权明细。

更完整的权限体系背景,可参阅 用户与权限总览 与 内置角色说明。

【免费下载链接】starrocksThe world's fastest open query engine for sub-second analytics both on and off the data lakehouse. With the flexibility to support nearly any scenario, StarRocks provides best-in-class performance for multi-dimensional analytics, real-time analytics, and ad-hoc queries. A Linux Foundation project.项目地址: https://gitcode.com/GitHub_Trending/st/starrocks

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询