无需修改内核即可为 PostgreSQL 数据库对象添加自定义属性

PostgreSQL内核开发——添加内核函数 在PostgreSQL内核的学习过程中,可以尝试向内核中添加一些函数,扩展PostgreSQL的功能。同时可以增加自己对PG内核的理解。这里我们以简单的添加一个helloworld函数为例,分析一下这个过程中涉及到的相关源码。 阅读详情

在开发实践中,经常会遇到一个问题:如何在不修改 PostgreSQL 内核代码的前提下,为数据库对象附加自定义元数据。本文展示了一种基于 PostgreSQL SECURITY LABELS 机制的可行方案,用于实现自定义属性。这种方式具备事务性、与数据库对象强关联,并且能够与标准 PostgreSQL 操作良好协同。

问题背景:复制冲突的管理

在一个典型的两主节点向第三节点复制数据的架构中,UPDATE/UPDATE 冲突较为常见。复制冲突的处理本身较为复杂,且在多数场景下并无通用解法,但某些列类型可以采用更简单的处理思路。

例如,在银行业务场景中,账户余额字段通常只允许增减操作。此时可以采用基于增量(delta)的方式:不在冲突时选择某个绝对值,而是分别计算两次更新的变化量并进行叠加。该方法仅需进行基础校验(如溢出检查、余额不小于 0),即可确保所有更新均被正确计入。

难点在于:如果 PostgreSQL 本身不支持此类机制,如何标记特定列以启用基于 delta 的冲突解决策略?理想状态下,可以直接通过类似以下语法完成:

ALTER TABLE accounts ALTER COLUMN balance SET delta_apply = 'true';

但这种深度集成 SQL 语法的方式实现难度较高,且对可移植性意义有限。更现实的需求是通过扩展接口完成设置,例如:

SELECT my_extension.set_delta_apply('accounts', 'balance', true);

社区中曾多次讨论为数据库对象引入自定义属性的提案,也曾提交过内核补丁,但实现代码规模较大,而应用场景相对有限,合入内核的可行性存疑。此外,有时需要为索引、大对象或数据类型等非表对象附加属性,这进一步增加了复杂度。更重要的是,即便补丁被接受,也只能影响未来版本,而现实需求往往是“当下可用”。

功能需求

实现该功能前需明确相关需求:

  • 对象生命周期绑定:属性必须与数据库对象建立内部依赖关系。例如,在执行 DROP … CASCADE 删除父对象时,属性也应随之自动删除。
  • 扩展关联性:属性需要与扩展建立明确关联,以便在扩展被卸载时由数据库系统正确处理。
  • 事务性行为:对象属性需满足事务规则与可见性约束,并行事务修改时,新属性值仅在当前事务内可见,提交前回滚则恢复原值。
  • 升级与迁移支持:在 pg_upgrade 以及 dump/restore 过程中,属性应随数据库对象一并正确迁移。

理想情况下可实现类似 PostgreSQL GUC 的会话级特性,但实现难度显著提升。

方案评析

以对象 OID 为键的简易全局哈希表无法满足需求,属性值可为变长类型(如字符串),对象与属性的关联实现复杂,且无法保障事务特性与 MVCC 机制。

另一种思路是在扩展中创建一张 <key, value> 表存储属性,由扩展在运行时查询该表。这在理论上可行,但实践中问题较多:涉及升级、dump/restore、复制一致性等一系列复杂问题,同时还需持续校验对象是否存在,并引入额外的查询开销,整体可靠性较差。

实现思路

具体目标是为任意表的列定义一个 delta_apply 属性,用于逻辑复制场景下的 UPDATE/UPDATE 冲突处理。当该属性启用时,订阅端不采用传统冲突解决策略,而是计算新旧值之间的差量,并将其累加到订阅端当前值中。

在 PostgreSQL 中,唯一同时满足上述全部需求的机制是 SECURITY LABELS。尽管该机制最初用于安全模块,但并未限制其仅用于安全相关元数据。需要注意以下事项:

  • 面向安全的工具可能会检查或校验标签内容。
  • 需要使用独立且唯一的 provider 名称,以避免冲突。

它是如何工作的?让我们看看这张图:

extension_side.jpg

实现的核心依赖于系统表 pg_seclabel。该表中的记录与数据库对象天然绑定,对其的增删改通过 SECURITY LABEL … 工具命令完成。扩展可以通过 utility hook 监听这一过程。

SECURITY LABEL 支持多种对象类型,包括视图、函数等,基本覆盖常见需求。每条标签记录包含对象的 OID 及对象类型(表、列、函数等),并通过文本字段存储任意自定义数据,同时通过 provider 字段区分不同模块生成的标签。

由于每次访问都直接查询 pg_seclabel 成本较高,且目前尚无系统级缓存,引入本地哈希缓存以降低开销:

typedef struct PropertyCacheEntry {
    Oid classId;
    Oid objectId;
    char *propertyValue;
    bool valid;
} PropertyCacheEntry;
static HTAB *property_cache = NULL;

通过注册 RelcacheCallback 实现缓存失效管理,对象执行 ALTER TABLE 操作时标记对应缓存条目无效。缓存填充策略可根据使用场景调整。例如,在核心 hook 中访问对象时加载,或在扩展提供的用户接口函数中主动加载。

属性增删的实现细节

为了保持各后端缓存一致性,每次属性变更都需要向其他进程发送失效通知。对象本身发生变化时,可通过 RelcacheCallback 处理;但属性变更本质上只是对 pg_seclabel 的 DML 操作,如何通知其他后端成为问题。

PostgreSQL 提供了 CacheInvalidateRelcacheByRelid,但仅适用于 pg_class 中的对象,对于数据类型等对象无效。因此,在实际实现中,属性变更时会触发一次对象自身的“无实质变更更新”,以借此触发相应的失效回调,从而刷新扩展内部缓存。

扩展通过 set_property() 接口向用户暴露能力,用于为指定对象设置 SECURITY LABEL。标签文本中描述属性值,例如 delta_apply: true。在扩展中实现的 seclabel_provider 回调负责校验对象类型及属性合法性。

标签文本字段具备高度灵活性,允许存储复杂结构,例如以 JSON 形式描述属性逻辑。

通过该机制,客户端与扩展之间建立了一种相对原生的通信方式。扩展可在运行时判断属性是否存在,并据此调整行为。

在 delta_apply 的具体实现中,逻辑复制订阅端在处理 UPDATE 记录时,会同时查询对应表的属性缓存。若存在标记为增量属性的列,则计算新旧值差量并累加到订阅端当前值。即便在冲突解决策略(如 last-update-wins)下决定拒绝整条更新,增量列的变更仍会被应用,从而降低冲突概率并确保增量更新不丢失。

外部干扰处理

pg_seclabel 仍然是系统目录表,具备足够权限的用户(如 DBA)可以直接修改其内容。为降低风险,可在扩展中引入内部 GUC,例如 myextension.call_guard。在扩展 UI 函数执行前将其置为 true,结束后重置为 false,并在关键路径中校验其状态是否符合预期。

理论上,超级用户仍可能通过手段绕过该限制。虽然可以进一步为该 GUC 设置 hook 进行防护,但实现复杂度显著提高,容易演变为过度设计。

总结

PostgreSQL SECURITY LABELS 机制提供了一种可靠、事务安全的方式,用于在不修改内核的情况下为数据库对象添加自定义属性。尽管该机制最初面向安全模块,但同样适用于扩展级元数据管理,且具备良好的生命周期管理与 MVCC 支持。

该方案支持多种对象类型,具备事务一致性,并可正确参与 dump/restore 与升级流程。

原文链接:

https://www.pgedge.com/blog/custom-properties-for-postgresql-database-objects-without-core-patches

作者:Andrei Lepikhov


HOW 2026 议题招募中

2026 年 4 月 27-28 日,由 IvorySQL 社区联合 PGEU(欧洲 PG 社区)、PGAsia(亚洲 PG 社区)共同打造的 HOW 2026(IvorySQL & PostgreSQL 技术峰会) 将再度落地济南。届时,PostgreSQL 联合创始人 Bruce Momjian 等顶级大师将亲临现场。

自开启征集以来,HOW 2026 筹备组已感受到来自全球 PostgreSQL 爱好者的澎湃热情。为了确保大会议题的深度与广度,我们诚邀您在 2026 年 2 月 27 日截止日期前,提交您的技术见解。

投递链接:https://jsj.top/f/uebqBc

从PostgreSQL到国产数据库:内核修改、分布式重构与自主之路 数据库作为现代信息系统的核心组件,其技术演进始终围绕数据存储、事务处理与查询优化等基础原理展开。开源数据库PostgreSQL以其严谨的学术架构和宽松的许可协议,成为众多技术创新的起点。理解其多版本并发控制(MVCC)、查询优化器等核心机制,是进行深度定制和性能优化的基础。这种深度理解的价值在于,它使团队能够超越简单的“套壳”应用,进入内核功能增强与分布式架构重构的深水区。在工程实践中,基于PG进行开发涉及从外围生态工具构建到内核级性能调优,乃至实现存算分离与弹性伸缩的云原生架构。这一过程不仅需要攻克分布式 阅读详情

相关推荐

PostgreSQL 数据库简介

PostgreSQL(通常简称为 Postgres)是一种功能强大的开源对象关系型数据库系统。它以其高度的可靠性和灵活性而闻名,支持复杂的查询、数据完整性、可扩展性以及对多种数据类型的处理。开源地址此外,PostgreSQL 的社区还提供了丰富的文档、教程和工具,帮助开发者和用户更好地使用和管理数据库。

dazhong2012的专栏 1859

读书笔记-PostgreSQL数据库内核分析 系统表

在关系数据库中,为了实现数据库系统的控制,必须提供数据字典的功能。数据字典不仅存储各种对象的描述信息,而且存储系统管理所需的各种对象的细节信息。从内容来看,数据字典包含: 数据库系统中所有对象及其属性的描述信息 对象之间关系的描述信息 对象属性的自然语言含义 数据字典变化的历史(即数据库的状态信息) 数据字典是关系数据库系统管理控制信息的核心,在PostgreSQL数据库系统中,系统表扮演着数据字典的角色。系统表是PostgreSQL数据库存放结构元数据的地方,它在PostgreSQL中表现为存放有系统

肥叔菌的博客 8907

postgreSQL内核分析1

1前言一直都想写关于PostgreSQL实现原理方面的文章,由于这是一个工作量巨大的工作,平时还要工作谋生,很难抽出时间 来写,希望能够坚持下来。PostgreSQL作为历史最悠久的开源数据库 管理系统 ,有关它的详细信息可以到http://www.postgresql.org/ 去查阅,这里不再赘述。在MySQL被Oracle 抓在手中以后,MySQL变得前途未卜,在这种情况下,PostgreS

Zhangjay的专栏 4445

PostgreSQL内核扩展实战:从自定义数据类型看国产数据库自主创新

关系型数据库作为企业核心数据存储的基石,其可扩展性设计决定了技术生态的繁荣度。PostgreSQL通过其开放的扩展架构,允许开发者使用C语言直接编写自定义数据类型、函数和索引,这种设计使得数据库能够深度适配特定业务场景。从技术原理看,PG的扩展机制基于动态链接库和类型系统,开发者可以遵循其API规范实现输入输出函数、二进制传输等接口,从而将新数据类型无缝集成到SQL引擎中。这种能力在工程实践中价值显著,例如实现符合中国国情的身份证号验证类型,或为特定行业定制空间、时序数据处理模块。正是基于这种强大的扩展性,

weixin_30239339的博客 426

PostgreSQL技术内核与中国数据库创新路径深度解析

在数据库技术领域,一个持续了近三十年的开源项目——PostgreSQL(简称PG),正深刻影响着全球乃至中国的技术格局。每当国内数据库厂商发布新产品,“基于PostgreSQL”或“兼容PostgreSQL”常常成为其技术标签。这不禁引发业界和开发者的广泛讨论:这是站在巨人肩膀上的高效创新,还是缺乏核心技术的“套壳”行为?中国数据库产业在经历了数十年的追赶与学习后,如今究竟走到了哪一步?本文将深入探讨PostgreSQL的技术内核、其在中国的发展生态,并尝试厘清“借鉴”与“创新”的边界,为开发者理解当下数据

weixin_33766805的博客 471

【小宇带你学PostgreSQL内核】第一课:课程简介

如果还想看到更多此类文章,请移步到小宇的博客。http://player.youku.com/embed/XMTg1NzAxNjM4NA==' frameborder=0 'allowfullscreen'>大纲 课程简介 开发环境 内核架构 parser rewriter optimizer executor access storage 自己动手开发新特性 1. 简介课程目标:通过该课程了

小宇的博客 2619

PostgreSQL数据库内核分析:深度解析数据库核心奥秘

PostgreSQL数据库内核分析:深度解析数据库核心奥秘 【下载地址】PostgreSQL数据库内核分析 探索PostgreSQL数据库内核的奥秘,这份详尽的PDF文档《PostgreSQL数据库内核分析》为您揭示了数据库的核心架构与运作机制。从数据库简介到内核模块的深入剖析,再到代码执行流程的细致解读,以及性能优化的...

gitblog_06710的博客 1013

优化Linux 内核性能,部署集群PostgreSQL数据库

背景 数据库的安装一直以来都挺复杂的,特别是Oracle,现在身边都还有安装Oracle数据库赚外快的事情。PostgreSQL其实安装很简单,但是那仅仅是可用,并不是好用。很多用户使用默认的方法安装好数据库之后,然后测试一通性能,发现性能不行就不用了。 原因不用说,多方面没有优化的结果。PostgreSQL数据库为了适应更多的场景能使用,默认的参数都设得非常保守,通常需要优化,比如检查点,SH...

阿啄debugIT 1028

数据库内核 - PostgreSQL深度剖析

理解PostgreSQL进程架构掌握MVCC实现原理理解B+树索引结构掌握查询优化器工作原理了解事务隔离级别实现理解WAL机制掌握Vacuum原理了解表膨胀和解决方案索引设计原则选择性高的列建索引组合索引注意顺序避免过多索引定期维护索引查询优化技巧使用EXPLAIN分析注意统计信息更新合理设置work_mem避免在WHERE中使用函数事务设计保持事务短小避免长事务合理使用隔离级别注意死锁顺序。

苦哈哈的 C++ 程序员,写这个技术博客不是为了装逼,也不是为了立人设,是为了收割流量 1051

Rails生产环境为何必须从SQLite切换到PostgreSQL

SQLite作为嵌入式数据库,采用文件级锁和动态类型机制,适合开发阶段快速迭代;而PostgreSQL提供行级锁、MVCC并发控制、严格数据类型与JSONB原生支持,是支撑高并发Web应用的工业级选择。其连接池友好性、系统级服务管理能力及与Ubuntu 18.04 LTS生态深度集成的特性,使其成为Rails生产部署的事实标准。在日活数千、评论点赞频繁、需全文检索与实时查询的典型业务场景中,PostgreSQL不仅解决ActiveRecord::ConnectionTimeoutError等稳定性问题,更通

weixin_34246551的博客 884

PostgreSQL三十年:从开源内核到国产数据库的自主创新之路

PostgreSQL(简称PG)已经走过了三十年的发展历程,从学术研究项目成长为当今数据库领域的“全能冠军”。根据2023年StackOverflow开发者调研,PostgreSQL在流行度、喜爱度和需求度三项核心指标上均位列第一,被广泛认为是“数据库界的Linux”。其开源、先进、稳定、可扩展的特性,使其不仅成为全球开发者的首选,更成为了中国数据库产业实现“自主可控”的重要基石。围绕PG衍生出的众多国产数据库产品,究竟是简单的“套壳”,还是真正的“自主”创新?这背后反映了中国数据库产业怎样的发展路径和技术

weixin_34391445的博客 314

PostgreSQL数据库内核分析

PostgreSQL数据库内核分析 【下载地址】PostgreSQL数据库内核分析 探索PostgreSQL数据库内核的奥秘,这份详尽的PDF文档《PostgreSQL数据库内核分析》为您揭示了数据库的核心架构与运作机制。从数据库简介到内核模块的深入剖析,再到代码执行流程的细致解读,以及性能优化的实用技巧,本资源为数据库...

gitblog_06736的博客 439

DolphinScheduler工作流中ChunJun任务保存失败的深度解析与实战修复

本文深度解析了在DolphinScheduler工作流中创建ChunJun任务时遭遇“parameter invalid”保存失败的普遍问题。其根源在于前端表单的`customConfig`参数默认值与后端校验逻辑不匹配。文章提供了两种实战修复方案:一是修改前端源码并重新编译,二是热更新已部署的JS文件,并对比了其适用场景与风险,帮助用户彻底解决此集成障碍。

weixin_29010003的博客 398

如何向pg内核中添加函数

向pg内核中添加函数主要分为两种 1.在已有的.c文件中加入自己的函数 2.自己创建一个.c文件 在第一种情况下举一个简单的例子: 首先,在某个已有的.c文件下添加自己函数体,如在src\backend\utils\adt\pseudotypes.c下,添加: Datum my_...

chunchengli0734的博客 978

毫米波雷达dd-mimo中发射天线辐射方向图变化

本文详细介绍了dd-mimo的相位调制原理,以及分离天线的办法,最后演示了在dd-mimo中因为相位调制带来的辐射方向图的变化。

weixin_44555637的博客 1171

S4 HANA 1809+折旧过账(AFAB/AFABN)凭证行数据存储逻辑变迁:从BSEG到ACDOCA的深度解析

本文深度解析了S4 HANA 1809+版本中折旧过账(AFAB/AFABN)凭证行数据存储逻辑的变迁,从传统的BSEG表迁移到ACDOCA表。文章详细探讨了这一变更的技术背景、官方设计意图及实际影响,包括数据存储量减小和系统性能提升等优势。同时提供了升级项目的应对策略和最佳实践建议,帮助用户顺利过渡到新的数据存储模型。

weixin_28731223的博客 294

PostgreSQL 操作自定义系统表

本文介绍 PostgreSQL 数据库内核系统表(System Catalog)完整实践,首先,介绍系统表作为元数据与配置载体的核心概念;随后通过简单实例,说明创建自定义系统表的初始化、头文件定义、数据文件编写及编译注册的四步流程;接着,用通过分析源码介绍了内核源码中系统表 Insert、Update、Delete 等操作实现方式,旨在说明 PG 创建并操作自定义系统表基本方式

王清欢的博客 3916

从零抓包分析AVDTP:用Wireshark解密蓝牙音频传输全流程

本文详细介绍了如何使用Wireshark抓包工具分析AVDTP协议,解密蓝牙音频传输的全流程。从实验环境搭建到信令交互解析,再到媒体流传输深度分析,逐步揭示蓝牙音频传输的技术本质,帮助开发者深入理解AVDTP协议的工作机制。

sun99的博客 204

【postgresql初级使用】逻辑复制是对数据库对象进行复制,非常灵活的完成数据归集与分发

在PostgreSQL中逻辑复制是一个非常实用的功能,因为它可以指定数据库对象进行复制,甚至可以指定到列,没有指定的列可以不复制,这就非常灵活。 可以用于数据的汇集,也可以用于数据的分类,特定数据的分发或备份等。 当然,逻辑复制非常灵活,在部署时一定要先设计好数据复制的路径,避免产生复制的循环,比如A复制到B,B又复制到A,这样数据就会越来越多。

一个追逐梦想的码农 8960

英飞凌TC3xx之一起认识GTM系列(一)先来认识GTM架构

本文讲述英飞凌TC3xx的通用计时器GTM的架构。

无所适从的我的博客 4600

汽车行业OTD业务模式入门学习

本文是在学习彭俊松老师的《汽车行业整车订单交付系统》后,对于OTD理解的一些摘录,供诸位参考学习。

qq_40664711的博客 1万+

华为GaussDB数据库相比PostgreSQL做了哪些内核优化

行业背景 随着全球经贸摩擦与中美贸易战愈演愈烈,国家基础软件自主可控被提上议程。数据库作为基础设施中重要的一环,承担着不可忽视的作用。近几年国产数据库得到了飞速的发展,特别是云数据库、分布式数据库产品也越来越多。这其中华为公司也已经在数据库领域深耕多年。 华为公司在今年5月份推出了自研的AI Native数据库GaussDB。GaussDB分为三个产品线,GaussDB100、GaussDB200...

数据库架构之美 6276

【Agent实战】Agent Skills 深度解析:从原理到落地的完整指南

本文深入解析了Agent Skills的概念及其在AI协作中的实际应用。Skill是一种可被AI按需发现和加载的任务执行说明书,它将团队经验、规则和步骤固化为结构化文档,如SKILL.md。文章阐明了Skill与Prompt、MCP、Function Calling的关系,强调Skill专注于"怎么做"而非底层能力。重点介绍了SKILL.md的编写规范,包括元数据命名规则、描述技巧和正文内容优化,旨在帮助开发者高效构建可复用的知识资产,提升Agent的任务执行稳定性与专业性。通过清晰的示例和对比,为AI架构

少说,多做 119

<PostgreSQL数据库内核分析>之第二章:PostgreSQL的体系结构

文章目录一、PostgreSQL安装和数据库命令1.安装2.PG的数据库命令3.PG源代码的组织结构二、PG体系结构1.系统表 一、PostgreSQL安装和数据库命令 1.安装 初始化数据库集簇 cd postgres-master 在拥有configure目录下执行: chmod +x ./configure make;make install cd /usr/local/pgsql mkdir data/-----数据库文件的存放目录 useradd postgres passwd postgres

喜欢打篮球的普通人 2594

【unity游戏开发入门到精通——UGUI】UI控件 —— Image图像控件

【unity游戏开发入门到精通——UGUI】UI控件 —— Image图像控件

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 2361

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

PostgreSQL数据库内核分析 完整版

PostgreSQL数据库内核分析 完整版 【下载地址】PostgreSQL数据库内核分析完整版 《PostgreSQL数据库内核分析》是一本深入剖析PostgreSQL数据库内核原理的专业书籍,由彭智勇编写。该书全面介绍了PostgreSQL的架构、设计理念及内核实现,涵盖存储引擎、事务管理、查询优化器、备份恢复、高可...

gitblog_06776的博客 447

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

上一篇: IvorySQL 5.0+:助力 Oracle 平滑过渡至 PostgreSQL 的里程碑式产品
下一篇: 揭开 PostgreSQL 读取效率问题的真相
IvorySQL
博客等级 码龄5年 745粉丝 565原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值