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
相关产品推荐
相关产品推荐

