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();

Другое приложение будет прослушивать соединение и применять соответствующую обработку для каждого события.

Если событие происходит, а мое приложение не запущено, событие никогда не будет обработано. Есть ли способ просмотреть все пропущенные уведомления?


person Charmi    schedule 22.07.2016    source источник


Ответы (1)


Уведомления нигде не хранятся, они просто отправляются в любой сеанс, прослушивающий тот же канал уведомлений. Но раз вы находитесь в базе данных, почему бы не сохранить уведомление в таблице, а затем слушатели просто опрашивают эту таблицу, когда они активны. Затем вы также можете использовать прямое 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;
person Patrick    schedule 22.07.2016
comment
Или даже объединить идею таблицы и уведомления, чтобы новые события поступали как уведомление, а старые можно было прочитать из таблицы. Таким образом, нет необходимости в опросе - person Sami Kuhmonen; 22.07.2016
comment
Идея использования NOTIFY/LISTEN заключается в том, чтобы избежать опроса таблиц. Я, вероятно, частично воспользуюсь предложенным решением и обойдусь порядковым номером. Таким образом, при запуске мое приложение обработает все уведомления, которые оно пропустило (можно узнать по порядковому номеру) ранее, а затем снова прослушает БД. - person Charmi; 22.07.2016