1. PostgreSQL 的钩子(Hook)机制,ProcessUtility_hook、ExecutorStart_hook?
请说明 PostgreSQL 的钩子(Hook)机制,包括 ProcessUtility_hook 和 ExecutorStart_hook?
- 钩子机制的概念
- 常用钩子(ProcessUtility_hook、ExecutorStart_hook)
- 钩子开发的应用
PostgreSQL 的钩子(Hook)机制是扩展通过共享库注册的回调函数,在服务器执行特定阶段被调用,从而在不改动核心代码的情况下拦截或扩展行为。常见钩子:ProcessUtility_hook 在实用命令(DDL、VACUUM、COPY 等)执行时调用,可用于拦截/审计/改写 DDL;ExecutorStart_hook 在查询执行开始时调用,用于查询审计、改写、监控。钩子按链式调用,扩展通过 _PG_init 注册并保存原钩子以便链式传递。典型应用:pgAudit、query 改写、权限增强、SQL 监控。
钩子机制是 PG 扩展开发的核心能力,让第三方在不动源码下扩展服务器行为。理解钩子链与注册时机(shared_preload_libraries 中加载)是开发扩展的基础。
static ProcessUtility_hook_type prev_ProcessUtility = NULL;
void _PG_init(void) {
prev_ProcessUtility = ProcessUtility_hook;
ProcessUtility_hook = my_ProcessUtility;
}