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

PostgreSQL中json_set与pgsql-http结合的触发器函数问题

问题:PostgreSQL触发器函数生成的JSON缺失"value"字段

我编写了如下的数据库触发器函数:

CREATE OR REPLACE FUNCTION public.webhook()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
    BEGIN
        PERFORM status FROM 
http_post('https://example.com/receiver', jsonb_set(jsonb_build_object('action',TG_OP,'table',TG_TABLE_NAME),'{value}',
to_jsonb(NEW.*)));
        RETURN NULL;
    END;
$function$
;

但生成的JSON未能正确包含预期的"value"字段,我期望请求体的JSON结构为:

{
"table": "issues",
"action": "UPDATE",
"value": ####
}

其中####为变更后的记录数据。单独使用PERFORM status FROM http_post('https://example.com/receiver', to_jsonb(NEW.*));可正常传递记录,但我希望同时包含action和table信息。


问题分析与解决方案

问题原因

你通过jsonb_set间接添加value字段的写法存在潜在风险,虽语法无明显错误,但这种嵌套构造方式容易因隐式参数处理导致字段未被正确注入。实际上完全不需要绕这个弯——直接一次性构造目标JSON结构才是更简洁可靠的方案。

修复后的触发器函数

CREATE OR REPLACE FUNCTION public.webhook()
 RETURNS trigger
 LANGUAGE plpgsql
AS $function$
    BEGIN
        PERFORM status FROM 
http_post('https://example.com/receiver', jsonb_build_object(
    'action', TG_OP,
    'table', TG_TABLE_NAME,
    'value', to_jsonb(NEW.*)
));
        RETURN NULL;
    END;
$function$
;

说明

直接通过jsonb_build_object同时传入action、table和value三个键值对,既避免了jsonb_set可能带来的不确定性,也让代码逻辑更清晰易读。修复后的函数能精准生成你期望的JSON结构,value字段会正确包含变更后的完整记录数据。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 12:10:08