人大金仓:用户 + 权限 + 所属角色

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_idusernameis_superusercan_create_dbpassword_expiremember_of_rolerole_is_superuserrole_can_create_db
10rdsadmintt
11appuserff2025-12-31readonly_groupff
12dbuserftdba_grouptt

🧠 小贴士

  • 如果一个用户属于多个角色,会显示多行;
  • 若要查看某角色下有哪些成员,也可以反过来查询 sys_auth_members.membersys_roles.rolname
  • 如果你使用的是 KingbaseES >= V8.6,部分系统表名可能是 pg_user / pg_roles 等兼容名,但建议使用 sys_ 开头的系统表更稳定。

是否需要我进一步封装为可复用的查询函数或导出脚本?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值