我创建了以下触发器来跟踪postgres表上的所有更改。
DROP TRIGGER tr_request_update_notify ON requests;
CREATE OR REPLACE FUNCTION request_update_notify() RETURNS trigger as $$
BEGIN
PERFORM pg_notify('request_update_notify', json_build_object('table', TG_TABLE_NAME, 'id', NEW.id, 'event', NEW.event, 'type', TG_OP)::text);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;
CREATE TRIGGER tr_request_update_notify AFTER UPDATE or INSERT ON requests FOR EACH ROW EXECUTE PROCEDURE request_update_notify();
另一个应用程序将监听连接并为每个事件应用适当的处理。
如果事件发生且我的应用程序未启动,则永远不会处理该事件。有没有办法概述所有错过的通知?
答案 0 :(得分:3)
通知不会存储在任何地方,它们只会被发送到在同一通知通道上侦听的任何会话。但是,看到您在数据库中,为什么不将通知存储在表中,然后监听器只是在它们处于活动状态时轮询该表。然后,您也可以直接使用json
而不是将其投射到text
。不像"自动"如NOTIFY/LISTEN
但其他方面非常简单。
CREATE OR REPLACE FUNCTION request_update_notify() RETURNS trigger as $$
BEGIN
INSERT INTO my_notifications (channel, message_time, notification)
VALUES ('request_update_notify', CURRENT_TIME,
json_build_object('table', TG_TABLE_NAME,
'id', NEW.id,
'event', NEW.event,
'type', TG_OP)
);
RETURN NEW;
END;
$$ LANGUAGE plpgsql;