Postgresql LISTEN / NOTIFY回顾

时间:2016-07-22 08:17:59

标签: postgresql

我创建了以下触发器来跟踪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();

另一个应用程序将监听连接并为每个事件应用适当的处理。

如果事件发生且我的应用程序未启动,则永远不会处理该事件。有没有办法概述所有错过的通知?

1 个答案:

答案 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;