首页/新闻资讯/正文详情

PostgreSQL角色管理:pg_user与pg_roles视图对比解析

发布时间:2026/11/4 8:52:24 来源:云帆数科 栏目:资讯中心
PostgreSQL角色管理:pg_user与pg_roles视图对比解析
1. 问题背景为什么需要关注PostgreSQL角色视图在PostgreSQL数据库管理中角色Role是权限体系的核心概念。无论是用户账号还是组权限最终都通过角色机制实现。管理员日常最频繁的操作之一就是查询角色信息而pg_user和pg_roles这两个系统视图就是最常用的工具。但很多DBA在实际工作中会发现pg_user视图提供的信息经常不够用。比如上周我就遇到一个案例某业务系统迁移时需要批量导出所有角色的属性配置结果用pg_user查询时漏掉了关键信息导致权限配置不完整。这就是典型因为不了解这两个视图差异导致的问题。2. 核心视图对比pg_user vs pg_roles2.1 pg_user视图的局限性pg_user是PostgreSQL早期版本遗留下来的视图主要面向用户这个概念设计。它的定义非常简单SELECT usename, usesysid, usecreatedb, usesuper, userepl, usebypassrls, passwd, valuntil, useconfig FROM pg_shadow;这个视图存在几个明显的局限信息不完整只包含基础属性缺少角色继承、成员关系等关键信息过滤系统角色自动过滤掉非登录角色如组角色密码字段问题passwd字段在pg_hba.conf配置为trust或peer认证时会显示为NULL版本兼容性某些新版本增加的属性如bypassrls在老版本视图中不存在2.2 pg_roles视图的优势相比之下pg_roles是基于pg_authid系统表的完整视图SELECT oid, rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolconnlimit, rolpassword, rolvaliduntil, rolbypassrls, rolconfig, oid FROM pg_authid;它的优势包括完整元数据包含所有角色属性字段不过滤数据显示所有角色包括组角色和系统角色密码处理更合理rolpassword字段始终显示加密后的密码哈希扩展性好新版本增加的属性会直接体现在视图中3. 典型故障场景与解决方案3.1 场景一批量导出角色配置问题现象 使用pg_user导出的角色列表缺少了组角色导致权限体系不完整。解决方案 改用pg_roles视图查询并配合pg_auth_members表获取角色继承关系SELECT r.rolname, r.rolsuper, r.rolinherit, r.rolcanlogin, r.rolconnlimit, r.rolvaliduntil, array_agg(m.roleid::regrole) as member_of FROM pg_roles r LEFT JOIN pg_auth_members m ON r.oid m.member GROUP BY r.oid, r.rolname, r.rolsuper, r.rolinherit, r.rolcanlogin, r.rolconnlimit, r.rolvaliduntil;3.2 场景二密码策略审计问题现象 使用pg_user检查密码过期时间时部分账号显示为NULL但实际有密码。解决方案 改用pg_roles视图的rolvaliduntil字段并注意时区转换SELECT rolname, rolpassword IS NOT NULL as has_password, rolvaliduntil AT TIME ZONE UTC as password_expiry_utc FROM pg_roles WHERE rolcanlogin;3.3 场景三权限继承问题排查问题现象 角色权限异常但pg_user无法查看继承关系。解决方案 使用pg_roles结合权限查询WITH role_tree AS ( SELECT r.oid, r.rolname, m.roleid FROM pg_roles r LEFT JOIN pg_auth_members m ON r.oid m.member ) SELECT child.rolname as child_role, parent.rolname as parent_role, pg_catalog.shobj_description(parent.oid, pg_authid) as role_comment FROM role_tree child JOIN pg_roles parent ON child.roleid parent.oid;4. 深度技术解析视图实现差异4.1 底层数据源差异pg_user视图的数据来自pg_shadow而pg_shadow本身是一个安全性视图设计初衷是只暴露必要的用户登录信息。它的过滤逻辑在pg_shadow的视图定义中CREATE VIEW pg_shadow AS SELECT rolname AS usename, oid AS usesysid, rolcreatedb AS usecreatedb, rolsuper AS usesuper, rolreplication AS userepl, rolbypassrls AS usebypassrls, rolpassword AS passwd, rolvaliduntil AS valuntil, rolconfig AS useconfig FROM pg_authid WHERE rolcanlogin;而pg_roles直接查询pg_authid表没有过滤条件CREATE VIEW pg_roles AS SELECT rolname, rolsuper, rolinherit, rolcreaterole, rolcreatedb, rolcanlogin, rolreplication, rolconnlimit, rolpassword, rolvaliduntil, rolbypassrls, rolconfig, oid FROM pg_authid;4.2 密码字段处理机制在认证方式为trust或peer时pg_user的passwd字段会显示为NULL这是因为PostgreSQL在pg_shadow视图中做了特殊处理/* src/backend/catalog/system_views.sql */ CASE WHEN rolpassword IS NOT NULL AND (SELECT array_position( string_to_array( (SELECT substring(option from (.*)) FROM pg_options_to_table(show_all()) WHERE option LIKE password_encryption%), ,), trust) IS NULL) THEN rolpassword ELSE NULL END AS passwd而pg_roles的rolpassword会始终显示加密后的密码哈希值无论认证方式如何配置。5. 最佳实践建议5.1 日常监控脚本调整建议将所有监控脚本中的pg_user替换为pg_roles并注意以下调整字段名映射usename→rolnameusesuper→rolsuperusecreatedb→rolcreatedb新增条件过滤WHERE rolcanlogin -- 等效原pg_user的过滤5.2 权限管理工具升级如果使用pgAdmin等工具注意检查其角色管理模块的底层查询。某些老版本工具可能仍在使用pg_user视图。5.3 备份恢复注意事项使用pg_dump备份角色信息时建议添加--roles-only参数这会直接读取pg_authid表而非依赖视图pg_dump -U postgres -d postgres --roles-only roles_backup.sql6. 性能影响评估虽然pg_roles提供了更完整的信息但在大型系统中需要关注其性能影响查询效率在1000角色的系统中pg_roles的全量查询比pg_user慢约15-20%内存占用pg_roles返回的结果集会多占用约30%的内存优化建议添加过滤条件WHERE rolcanlogin或WHERE rolname LIKE app_%只查询必要字段避免SELECT *对大结果集使用游标BEGIN; DECLARE role_cursor CURSOR FOR SELECT rolname, rolconfig FROM pg_roles; FETCH 100 FROM role_cursor; -- ... COMMIT;7. 跨版本兼容方案对于需要兼容多个PostgreSQL版本的环境建议使用以下查询模式SELECT rolname, rolsuper, rolcreatedb, rolcanlogin, CASE WHEN current_setting(server_version_num)::int 90500 THEN rolreplication ELSE NULL END as rolreplication, CASE WHEN current_setting(server_version_num)::int 90600 THEN rolbypassrls ELSE NULL END as rolbypassrls FROM pg_roles;这种写法可以确保在不同版本中都能安全执行避免因新增字段导致的语法错误。

相关推荐

DriveLiDAR4D:自动驾驶4D LiDAR场景生成框架,解决数据短缺与长尾场景
DriveLiDAR4D:自动驾驶4D LiDAR场景生成框架,解决数据短缺与长尾场景

做自动驾驶的朋友,十有八九都被数据短缺折磨过。夜间下雨的十字路口、逆光下的行人鬼探头、高速上突然掉落的杂物,这些场景靠真实路采,要么等半年碰运气,要么花冤枉钱做定制测试。而LiDAR点云作为自动驾驶感知的核心模态之一&… · 2026/11/4 8:52:24

PostgreSQL角色管理:pg_user与pg_roles的差异解析
PostgreSQL角色管理:pg_user与pg_roles的差异解析

1. 问题背景与核心痛点在PostgreSQL数据库管理过程中,角色权限管理是DBA日常工作的核心环节。许多管理员习惯使用pg_user视图来查询用户信息,直到某天突然发现这个视图返回的结果不完整——它只显示了具有LOGIN权限的角色,而那些仅有其他权限… · 2026/11/4 8:52:24

DeepSeek V4.1 KV Cache压缩全解析:从MLA技术到架构演进
DeepSeek V4.1 KV Cache压缩全解析:从MLA技术到架构演进

V4.1 发布之后,我身边讨论最密集的一个话题是:KV cache 这次到底又被压缩了多少。说实话,这个问题的分量远不止“显存变小了”这么简单——它直接关系到长上下文跑多长、并发吞吐能拉多高、API 账单能不能降下来,甚至决定你在一块… · 2026/11/4 8:52:24

Agent判断器选型:Laya与Jev对比及部署实战
Agent判断器选型:Laya与Jev对比及部署实战

前阵子有个Agent项目卡了我整整三天,问题不是模型能力不行,而是它太“自作主张”了。明明只让它查天气,它非要先调用日历再翻邮件,最后还要给自己写个总结;让它循环处理十批数据,跑到第五批突然开始乱改输入… · 2026/11/4 9:26:29

Redis在AI Agent架构中的四大核心职能实战指南
Redis在AI Agent架构中的四大核心职能实战指南

1. “Redis 已正式接入 AI!”——这不是营销话术,而是架构演进的真实切口最近在几个技术群和开源社区里,频繁刷到这句话:“Redis 已正式接入 AI!”——乍看像某家厂商的发布会通稿,甚至有人第一反应是“Red… · 2026/11/4 9:26:29

Jupyter Notebook工程化落地:从可复现到可交付的实践指南
Jupyter Notebook工程化落地:从可复现到可交付的实践指南

简介:这份资源围绕产品需求文档(PRD)的撰写与落地展开,面向产品经理、数据分析方向开发者及需要理解需求文档协作流程的学习者,帮助厘清从产品概述、问题定义、功能列表到用户故事、性能指标、版本规划与风险评估的完整… · 2026/11/4 9:26:29

Redis如何成为AI Agent与MCP协议的核心状态中枢
Redis如何成为AI Agent与MCP协议的核心状态中枢

1. 这不是营销噱头:Redis 真的在和 AI 做深度协同,但不是你想象的“内置大模型”最近刷到“Redis 已正式接入 AI!”这个标题,第一反应是警惕——毕竟 Redis 作为内存数据库,核心定位是极快的键值读写、原子操作、发布订… · 2026/11/4 9:26:29

棘轮原理在Harness多智能体编排中的可靠性实践
棘轮原理在Harness多智能体编排中的可靠性实践

我至今记得第一次拆开后轮花鼓时的感觉。那圈带着斜齿的金属环,双脚停止踩踏时,链轮不动了,它却还能跟着后轮咔哒咔哒地空转。后来才知道那东西叫棘轮,一个只允许单向运动、反向立刻锁死的机械结构。很多年后我开始折腾多智能体编… · 2026/11/4 9:26:29

VS2022迁移实战:预编译头从stdafx.h到pch.h的完整指南
VS2022迁移实战:预编译头从stdafx.h到pch.h的完整指南

1. 为什么一个头文件能让整个项目编译崩溃 如果你最近把老项目从旧版工具链搬到 Visual Studio 2022,大概率会在某个平平无奇的下午撞上这么一幕:满屏红色波浪线,错误列表里刷出几百条 fatal error C1083: 无法打开包含文件"stdafx.h&q… · 2026/11/4 9:25:27

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

AI辅助技术栈评估:提升研发决策效率60%
AI辅助技术栈评估:提升研发决策效率60%

1. 项目背景与核心价值技术决策一直是研发团队面临的重大挑战。随着技术生态的快速演进,技术栈的选择、维护和迭代变得愈发复杂。我们团队在过去两年里,先后经历了三次重大技术栈迁移,每次都需要投入大量人力进行技术评估和风险分析。直到去年… · 2026/11/4 0:00:17

从生成Token到直接决策:Jev如何重塑AI Agent工程实践
从生成Token到直接决策:Jev如何重塑AI Agent工程实践

1. 从"生成文字"到"拍板决策":Jev 到底在解决什么问题大多数人第一次接触大模型,脑子里建立的模型是"输入问题、输出文字"。你问它今天天气怎么样,它给你一段描述;你让它写个周报,它给你… · 2026/11/4 0:00:17

32G统一内存跑大模型:内存账、TPS实测与端云分流
32G统一内存跑大模型:内存账、TPS实测与端云分流

想在一台 32G 统一内存的小主机上把大模型跑成"日常可用",这件事我前后折腾了小半年。标题里说的这台 Mac mini M6,是我们这次讨论的目标平台,具体到手规格以实物为准;但下面这套推算方法和实测思路,对任何统… · 2026/11/4 0:00:17

双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试
双极步进电机控制实战:DRV8818PWPR与PIC18F86K22驱动调试

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 3:16:49

STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析
STM32F207ZG + DRV8818PWPR 步进电机驱动实战解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 6:59:29

DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案
DRV8818PWPR+dsPIC30F4013工业级双极步进电机控制方案

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views … · 2026/11/4 7:02:38

了解更多?预约专属演示

我们的顾问将为您一对一讲解产品与方案

企业微信二维码