postgres构建具有可选键值对的json对象



下面我实现了一个简单的postgresnotify触发器函数在insertupdate事务之后,将OLDNEW记录发布为自定义json对象。

CREATE OR REPLACE FUNCTION test() 
RETURNS trigger AS
$BODY$
BEGIN
PERFORM pg_notify('test_chanel', json_build_object('new',row_to_json(NEW),'old',row_to_json(OLD))::text );
RETURN NULL;
END;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

应发出

{
"old":{...},
"new":{...}
}

问题是,对于insert,OLD显然不存在。如何使其成为可选?

您可以在触发器中使用自动变量TG_OP。有了这个变量,你的代码应该看起来像

BEGIN
IF TG_OP = 'INSERT' THEN
PERFORM pg_notify('test_chanel', json_build_object('new',row_to_json(NEW));
ELSEIF TG_OP = 'UPDATE' THEN
PERFORM pg_notify('test_chanel', json_build_object('new',row_to_json(NEW),'old',row_to_json(OLD))::text );
ELSE
PERFORM pg_notify('test_chanel', json_build_object(row_to_json(OLD))::text );
END IF;
END;

最新更新