一个钩子提供了一种启用自定义例程的方式,这些例程在PostgreSQL运行生命周期的特定点被调用。
各种钩子自PostgreSQL 8.2以来就一直存在于PostgreSQL中。然而,文档很少。
可用钩子
- 通用钩子
- 安全钩子
- 函数管理器钩子
- 规划器钩子
- 执行器钩子
- EXPLAIN钩子
explain_get_index_name_hookexplain_per_node_hookexplain_per_plan_hookexplain_validate_options_hook
- PL/pgSQL钩子
变更历史
- PostgreSQL 19
- PostgreSQL 18
- PostgreSQL 16
ldap_password_hook已添加(提交 419a8dd8)
- PostgreSQL 13
openssl_tls_init_hook已添加(提交 896fcdb2)
- PostgreSQL 9.6
create_upper_paths_hook已添加(提交 5864d6a4)
- PostgreSQL 9.5
row_security_policy_hook_permissive已添加(提交 0bf22e0c)row_security_policy_hook_restrictive已添加(提交 0bf22e0c)set_join_pathlist_hook已添加(提交 e7cb7ee1)set_rel_pathlist_hook已添加(提交 c2ea2285)
- PostgreSQL 9.2
emit_log_hook已添加(提交 19dbc346)post_parse_analyze_hook已添加(提交 a40fa613)
- PostgreSQL 9.1
ClientAuthentication_hook已添加(提交 20709f81)ExecutorCheckPerms_hook已添加(提交 f4122a8d)ExecutorFinish_hook已添加(提交 a874fe7b)fmgr_hook已添加(提交 d368e1a2)needs_fmgr_hook已添加(提交 d368e1a2)object_access_hook已添加(提交 cc1ed40d)
- PostgreSQL 9.0
check_password_hook已添加(提交 c742b795)ProcessUtility_hook已添加(提交 a5495cd8)
- PostgreSQL 8.4
ExecutorEnd_hook已添加(提交 cd35e9d7)ExecutorRun_hook已添加(提交 6cc88f0a)ExecutorStart_hook已添加(提交 cd35e9d7)get_attavgwidth_hook已添加(提交 7b7df9f0)get_index_stats_hook已添加(提交 7b7df9f0)get_relation_stats_hook已添加(提交 7b7df9f0)shmem_startup_hook已添加(提交 dad75a62)
- PostgreSQL 8.3
ExplainOneQuery_hook已添加(提交 604ffd28)explain_get_index_name_hook已添加(提交 604ffd28)get_relation_info_hook已添加(提交 604ffd28)join_search_hook已添加(提交 cdf0231c)planner_hook已添加(提交 604ffd28)
- PostgreSQL 8.2
提议的钩子
会话开始/结束钩子
以下钩子
session_start_hooksession_end_hook
在PostgreSQL 13开发周期中,提交 e788bd92 添加了这些钩子,但随后在提交 9555cc8d 中撤销;请参阅主题“Add hooks for session start and session end, take two”。
示例
扩展中的共享内存启动钩子
static shmem_startup_hook_type prev_shmem_startup_hook = NULL;
static void our_shmem_startup(void);
void
_PG_init(void)
{
prev_shmem_startup_hook = shmem_startup_hook;
shmem_startup_hook = our_shmem_startup;
}
/*
* shmem_startup hook: allocate or attach to shared memory,
*/
static void
our_shmem_startup(void)
{
bool found;
if (prev_shmem_startup_hook)
prev_shmem_startup_hook();
/*
* Create or attach to the shared memory state, including hash table
*/
LWLockAcquire(AddinShmemInitLock, LW_EXCLUSIVE);
/* do stuff... */
LWLockRelease(AddinShmemInitLock);
}
从PostgreSQL 15开始,除了shmem_startup_hook之外,可能还需要shmem_request_hook。
