目录标题
sys_roles
执行改成基于 sys_roles
的查询后,结果中确实多出了许多额外的角色,比如:
pg_monitor
pg_read_all_stats
pg_write_server_files
pg_signal_backend
- 等等
这些在原始的 sys_user
查询中是看不到的。
✅ 原因说明:这些是系统内置角色
KingbaseES(兼容 PostgreSQL)中存在一系列内置角色(system predefined roles),这些角色:
角色名 | 用途简述 |
---|---|
pg_monitor | 允许查询系统状态监控视图 |
pg_read_all_settings | 允许读取数据库配置参数 |
pg_read_all_stats | 允许读取系统统计信息 |
pg_write_server_files | 允许使用 COPY TO/FROM FILE |
pg_signal_backend | 允许对其他进程发送信号 |
pg_stat_scan_tables | 允许执行 ANALYZE 等统计操作 |
pg_execute_server_program | 允许执行外部程序(高权限) |
这些角色通常不能登录(can_login = f
),而是设计成赋予其他用户权限的机制,比如你可以执行:
GRANT pg_monitor TO qmonitor;
来让 qmonitor
拥有对 pg_stat_activity
的访问权限。
🧩 如何只筛选“用户角色”而排除这些系统角色?
你可以加上如下过滤条件:
WHERE r.rolcanlogin = true
这样只保留可登录的用户,排除掉系统定义的“服务型角色”。
✅ 最终推荐查询语句(仅看可登录用户 + 角色关系)
SELECT
r.oid AS role_id,
r.rolname AS role_name,
r.rolsuper AS is_superuser,
r.rolcreatedb AS can_create_db,
r.rolcanlogin AS can_login,
m.member AS member_sysid,
u.usename AS member_name
FROM
sys_roles r
LEFT JOIN
sys_auth_members m ON r.oid = m.roleid
LEFT JOIN
sys_user u ON m.member = u.usesysid
WHERE
r.rolcanlogin = true
ORDER BY
role_name;
🧠 结语
- 使用
sys_user
→ 看登录用户; - 使用
sys_roles
→ 看所有角色(含系统角色); - 要清爽排除内置角色 → 加
WHERE r.rolcanlogin = true
; - 要分析用户属于哪些权限组 → 查
sys_auth_members
。
sys_user
问题是:esrep
用户在 \du+
命令中存在,但在你执行的 SQL 查询结果中没有显示出来。这是一个常见的查询遗漏问题,下面详细解释原因及解决方法。
🎯 问题原因:sys_user
表中不包含角色用户(如 esrep)
Kingbase(类似 PostgreSQL)中,用户和角色的系统信息分别保存在不同的系统视图中:
sys_user
:只列出具有登录权限的用户(即 login 角色);sys_roles
:包含所有角色和用户,包括不能登录的角色(如纯角色组);\du
或\dg
:显示的是sys_roles
里的内容(过滤部分信息)。
👀 esrep
可能是一个角色,而不是传统意义上的“用户”,比如它被用作复制账号,但没有明确登录权限。
✅ 修复方式:改为基于 sys_roles
查询所有角色+权限
下面是替代查询语句,用于显示系统中**所有角色(含用户)**的信息:
SELECT
r.oid AS role_id,
r.rolname AS role_name,
r.rolsuper AS is_superuser,
r.rolcreatedb AS can_create_db,
r.rolcanlogin AS can_login,
m.member AS member_sysid,
u.usename AS member_name
FROM
sys_roles r
LEFT JOIN
sys_auth_members m ON r.oid = m.roleid
LEFT JOIN
sys_user u ON m.member = u.usesysid
ORDER BY
role_name;
📌 字段说明
字段名 | 含义 |
---|---|
role_id | 角色/用户的系统 ID |
role_name | 角色或用户名(都在这里) |
is_superuser | 是否是超级用户 |
can_create_db | 是否可创建数据库 |
can_login | 是否可以登录(用户才为 T) |
member_name | 属于该角色的用户(如有) |
✅ 快速验证 esrep
是不是不能登录的角色
SELECT rolname, rolcanlogin FROM sys_roles WHERE rolname = 'esrep';
如果 rolcanlogin = false
,说明它只是个系统角色,不在 sys_user
中,自然不会出现在你原来的查询里。
📌 总结
查询方式 | 是否能查到 esrep |
---|---|
sys_user | ❌ 否(只查登录用户) |
sys_roles | ✅ 是(查所有角色) |
\du+ | ✅ 是(等价于 sys_roles) |
sys_roles.rolcanlogin | 可判断是否为登录用户 |
人大金仓:用户 + 权限 + 所属角色
以下是 人大金仓(KingbaseES)数据库中,查看“用户 + 权限 + 所属角色”一体化信息的通用查询方式,便于你掌握系统中有哪些用户、具有什么权限、属于哪些角色组:
✅ 一体化查询语句(推荐)
SELECT
u.usesysid AS user_id,
u.usename AS username,
u.usesuper AS is_superuser,
u.usecreatedb AS can_create_db,
u.valuntil AS password_expire,
r.rolname AS member_of_role,
r.rolsuper AS role_is_superuser,
r.rolcreatedb AS role_can_create_db
FROM
sys_user u
LEFT JOIN
sys_auth_members m ON u.usesysid = m.member
LEFT JOIN
sys_roles r ON m.roleid = r.oid
ORDER BY
username;
📌 字段说明
字段名 | 含义 |
---|---|
user_id | 用户系统 ID |
username | 用户名 |
is_superuser | 是否是超级用户(t / f ) |
can_create_db | 是否可创建数据库 |
password_expire | 密码有效期(为空则无过期限制) |
member_of_role | 所属角色名(若为空表示无角色成员关系) |
role_is_superuser | 所属角色是否是超级角色 |
role_can_create_db | 所属角色是否能建库 |
📌 示例输出(模拟结果)
user_id | username | is_superuser | can_create_db | password_expire | member_of_role | role_is_superuser | role_can_create_db |
---|---|---|---|---|---|---|---|
10 | rdsadmin | t | t | ||||
11 | appuser | f | f | 2025-12-31 | readonly_group | f | f |
12 | dbuser | f | t | dba_group | t | t |
🧠 小贴士
- 如果一个用户属于多个角色,会显示多行;
- 若要查看某角色下有哪些成员,也可以反过来查询
sys_auth_members.member
和sys_roles.rolname
; - 如果你使用的是 KingbaseES >= V8.6,部分系统表名可能是
pg_user
/pg_roles
等兼容名,但建议使用sys_
开头的系统表更稳定。
是否需要我进一步封装为可复用的查询函数或导出脚本?