下面我实现了一个简单的postgresnotify触发器函数在insert
或update
事务之后,将OLD
和NEW
记录发布为自定义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;