软件通常为安装或补丁/升级期间创建的对象的标准对象(PostgreSQL 将这些“内置”对象)的标识符保留 id 发布范围。我很难找到 PostgreSQL 对象的 OID 版本范围。有人可以指出我的文档吗?此外,OID 是否正在逐步退出 PostgreSQL?这将如何影响我的问题?
例如,pg_roles 表似乎对安装期间创建的对象或补丁使用四位数或更少的 OID,但文档有限。这是我能找到的最接近的东西。
https://www.postgresql.org/docs/12/release-12.html
为新的内置对象(例如新函数)手动分配 OID 的补丁现在应该在 8000-9999 范围内随机选择 OID。在开发周期结束时,提交的补丁使用的 OID 将使用新的 renumber_oids.pl 脚本重新编号为较低的数字,目前在 4xxx 范围内。这种方法应该会大大降低不同进程内补丁之间 OID 冲突的几率。
虽然没有保留任何 OID 供外部使用的特定政策,但建议分叉和其他需要私有手动分配 OID 的项目使用高 7xxx 范围内的数字。这将避免与最近合并的补丁发生冲突,并且核心项目应该需要很长时间才能达到该范围。
鉴于上面的引用,也许更好的提问方式是“用于每种类型的新对象创建(即:pg_roles)的 OID 种子值或 OID 算法是什么?”
虽然没有保留任何 OID 供外部使用的具体政策
系统对象的 OID 范围
1
为16383
.在 PostgreSQL 包含文件中,
server/access/transam.h
有关于如何分配 OID 的演示文稿,这可能会有所帮助:如果您出于某种原因在系统范围内需要自己的 OID,我认为这将属于“分叉”类别,因此在
8000-9999
范围内。不,但是 OID 列在 Postgres 12 中被降级为“普通”列,而不是系统列。在 Postgres 的演变过程中,将 OID 规范化为普通的每个表的数字主键,而不是它们在原始设计中的“全局唯一主键”,这是一个渐进的过程。例如,请参阅博客文章OIDs 降级为普通列:关于这种演变的过去一瞥。这不是要逐步淘汰 OID,而是要确保它们不会妨碍进展。
pg_roles
本身不是一张桌子,它是一个视图。它的一列名为oid
,其值来自pg_authid.oid
。它是 的主键pg_authid
。这实际上与安装没有太大关系,除了创建的系统角色(通常postgres
)具有oid
低于 的值16384
,而安装后创建的角色使用CREATE USER
orCREATE ROLE
将具有oid
高于 的值16384
。