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

