Postgresql 监听/通知回顾

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

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

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

最佳答案

通知不会存储在任何地方,它们只是发送到在同一通知 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/

相关文章:

postgresql - docker + Crontab : find container ID from service name for use in crontab

postgresql -/phppgadmin Forbidden 您没有权限访问此服务器上的/phppgadmin/

sql - POSTGRES SQL QUERY 错误语法无效

sql - 使用 Psycopg2 和 Greenplum 数据库获取最后插入的行 ID

sql - Postgres 从字符串运行 SQL 语句

sql - 通过排除重叠本身,将具有优先级的重叠时间段的持续时间相加

postgresql - Postgres systemd 单元文件如何确定要运行的 Postgres 版本?

sql - Postgres 多对多关系 : finding rows all having relation to a set of rows from related table

ruby-on-rails - Postgis 纬度/经度读反了

json - Golang从Postgres获取原始JSON