PostgreSQL角色视图故障排除:pg_user的局限性及其在pg_roles中的解决之道
2026/6/10 20:14:53 网站建设 项目流程

pg_user视图实际上是pg_roles视图的一个简化版本,它只包含那些可以登录的用户(即rolcanlogintrue的角色)。在现代 PostgreSQL 版本中,推荐使用功能更全面的pg_roles

列名描述
usesysid用户的 OID (Object Identifier),唯一标识符。
usename用户的名称(登录名)。
usecreatedb布尔值,是否允许创建数据库。
usesuper布尔值,是否为超级用户。
usecatcreaterole布尔值,是否允许创建其他角色。
useconfig用户的运行时配置设置(例如:SET work_mem = '10MB')。

问题
运行SELECT * FROM pg_user;时,你发现一些已创建的角色(Role)没有出现在结果中。

原因
pg_user只显示可以登录的角色(那些在创建时或修改时带有LOGIN属性的角色)。它不显示组角色 (Group roles) 或没有LOGIN属性的普通角色。

詳細を見る

Python

pandas

PyQt

解决/替代方案
总是使用pg_roles视图来查看数据库中的所有角色,包括组角色和没有登录权限的角色。

-- 查看所有角色,包括登录用户和组角色 SELECT rolname, -- 角色名称 rolcanlogin, -- 是否可以登录 rolsuper -- 是否是超级用户 FROM pg_roles ORDER BY rolname;

问题 尝试从 pg_user 或 pg_roles 中查看用户的加密密码时,发现密码列(以前是 passwd,现在是 rolpassword)显示为 或 NULL。

原因
出于安全考虑,只有超级用户 (Superuser) 才能查看其他用户的加密密码哈希值。普通用户或非超级用户角色对该列的访问受到限制。

解决/排除故障
如果你需要验证某个用户是否存在或其属性,请使用rolname和其他非敏感列。如果你确实需要管理密码(例如重置),必须使用具有SUPERUSER权限的角色进行操作。

-- 以超级用户身份为用户 'new_user' 设置新密码 ALTER USER new_user WITH PASSWORD 'strong_new_password'; -- (注意:在查询 pg_roles 时,普通用户只会看到自己的密码哈希值,而其他用户的则不可见)

问题
useconfig列显示为数组格式,其中包含用户的特殊运行时配置设置,但难以直接解析和管理。

原因
useconfig存储了用户特定的配置覆盖,例如work_memsearch_path

解决/替代方案
要以更结构化的方式查看或修改这些设置,可以使用ALTER ROLE ... SET ...命令,并可以查询pg_settings视图来检查当前生效的配置。

-- 为特定用户设置一个运行时参数 ALTER ROLE report_user SET work_mem = '64MB'; -- 检查当前会话的生效设置(这反映了用户的配置) SHOW work_mem; -- 查看 pg_roles 中的配置(超级用户可见) SELECT rolname, rolconfig FROM pg_roles WHERE rolname = 'report_user';
视图/命令作用推荐使用情况
pg_roles包含所有角色(用户和组)的完整信息。强烈推荐,用于管理和审计所有角色。
pg_user仅包含可登录的用户信息。已弃用/不推荐,除非是为了兼容旧系统。
ALTER USER/ROLE用于修改用户或角色的属性、权限和密码。进行任何角色管理操作时。

使用pg_roles视图可以更全面地管理您的数据库角色,避免了pg_user视图的局限性。

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

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

立即咨询