我创建了以下触发器来跟踪 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();
另一个应用程序将监听连接并对每个事件应用适当的处理。
如果事件发生并且我的应用程序未启动,则该事件将永远不会被处理。有没有办法回顾所有错过的通知?
最佳答案
通知不会存储在任何地方,它们只是发送到在同一通知 channel 上监听的任何 session 。但是看到您位于数据库中,为什么不将通知存储在表中,然后监听器在事件时只需轮询该表即可。然后,您还可以直接使用 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;
关于Postgresql 监听/通知回顾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38521517/