首页 > 解决方案 > PostgreSQL 在表更新时触发事件

问题描述

我是 PostgreSQL 的新手,我想知道或有一些线索:

我的问题是:当用户执行某些操作(登录、注册、更新信息)时,我有一个 SSO 在事件表中插入行。我需要在另一个解决方案(忠诚度计划)中实时利用这些插入。

现在我想每分钟查询一次表(在 nodeJS 中)并将表的大小与前一分钟的大小进行比较。我认为这不是好方法:)

标签: postgresqleventsdatabase-trigger

解决方案


原则上,您可以使用触发器来做到这一点。如果 API 在数据库外部,您需要一个用 C 或 PL/Perl 或 PL/Python 等语言编写的触发器函数来执行您需要的操作。

但是,除非可以保证此操作很快,否则在触发器中运行它可能不是一个好主意。触发器与触发语句在同一个事务中运行,因此如果您的触发器碰巧运行了很长时间,您最终会得到一个很长的数据库事务。这有两个主要缺点:

  • 锁会被长时间持有,这会损害并发性和性能,并且还会增加死锁的风险。

  • Autovacuum 无法删除事务启动时仍处于活动状态的死行,这可能导致繁忙表上的表过度膨胀。

为了避免这种风险,通常最好使用排队系统:触发器在队列中创建一个条目,这是一个快速操作,工作进程在数据库之外异步读取和处理这些队列条目。

众所周知,在数据库中实现队列非常困难,因此您可能需要寻找现有的解决方案。


推荐阅读