You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PostgreSQL通用审计触发器中从OLD动态提取PK值

PostgreSQL 17审计触发器:动态提取主键值并排除主键列

1. 动态提取主键值到pk_value

你已定义pk_col_name变量获取主键列名(格式为表名_id),直接通过hstore从OLD行对象中提取对应值即可:

-- 假设pk_col_name已通过如下方式定义
pk_col_name := quote_ident(TG_TABLE_NAME || '_id');

-- 从OLD行中提取主键值并赋值给pk_value
pk_value := (hstore(OLD) -> pk_col_name)::uuid;

若偏好JSONB方式,也可使用:

pk_value := (row_to_json(OLD) ->> pk_col_name)::uuid;

2. 排除主键列在旧值hstore中

利用hstore的delete函数,从原始旧值hstore中移除主键列的键值对:

-- 生成排除主键列后的旧值hstore
old_data := delete(hstore(OLD), pk_col_name);

嵌入函数的完整代码片段

在audit.if_modified_func()中找到处理old_data和pk_value的逻辑块,替换为以下代码:

DECLARE
    pk_col_name text;
    pk_value uuid;
    old_data hstore;
BEGIN
    -- 获取主键列名
    pk_col_name := quote_ident(TG_TABLE_NAME || '_id');
    
    -- 提取主键值
    pk_value := (hstore(OLD) -> pk_col_name)::uuid;
    
    -- 生成排除主键列的旧值hstore
    old_data := delete(hstore(OLD), pk_col_name);

    -- 后续原有逻辑:将pk_value和old_data插入审计表等
    -- ...
END;

注意事项

  • 确保所有表主键均为表名_id格式的UUID类型,否则需调整类型转换逻辑
  • 若函数中已存在old_data变量,直接覆盖即可;未声明则需先添加变量声明

内容的提问来源于stack exchange,提问作者happyfirst

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 19:33:13