PostgreSQL中角色OID是否具有不可变性?
关于PostgreSQL角色OID持久性的问题解答
核心结论
角色OID是可靠的永久唯一标识,只要角色本身存在,它的OID就不会改变,完全可以用来建立用户表与登录角色的关联。
详细说明
- 角色OID在创建时由系统分配,除非角色被删除重建,否则OID永远不会变更——哪怕你修改角色名称、权限等属性,OID都保持原样。PostgreSQL内部就是用OID来唯一识别角色的,这是系统级的唯一标识逻辑。
- 备份还原场景的OID一致性:如果用
pg_dumpall或者带角色备份的pg_dump(比如--roles-only参数)还原角色,还原后的角色OID会和原数据库完全一致。只有当你手动重新创建角色(而非通过备份还原)时,才会分配新的OID。
针对你的需求的建议
用角色OID作为关联依据是最优选择:
- 它不会像角色名称那样可被修改,能保证关联关系的稳定性;
- 你可以用内置函数
pg_get_userbyid(oid)快速通过OID获取角色名称,方便查询展示; - 绝对不要手动修改系统表中的OID,这会破坏数据库内部一致性,引发严重问题。
内容的提问来源于stack exchange,提问作者Karen
相关产品推荐
相关产品推荐

