基本上,我们想为要通知UPDATE / INSERT / DELETE操作的每个表创建一个TRIGGER。触发该触发器后,它将执行一个函数,该函数将简单地将新行(对事件进行编码)追加到日志表中,然后我们将从外部服务中进行轮询。
这是触发器的标准用法。
在开始使用Postgres TRIGGER之前,我们想知道它们如何扩展:在单个Postgres安装中可以创建多少个触发器?
如果继续创建它们,最终将用完磁盘空间。
触发器没有具体限制。
PostgreSQL限制记录在About页面上。
它们会影响查询性能吗?
这取决于触发器的类型,触发器的语言以及触发器的功能。
一个BEFORE ... FOR EACH STATEMENT
不执行任何操作的简单PL / PgSQL 触发器的开销几乎为零。
FOR EACH ROW
触发器比FOR EACH STATEMENT
触发器具有更高的开销。显然,随着受影响的行数进行缩放。
AFTER
触发器比BEFORE
触发器更昂贵,因为触发器必须排队直到语句完成其工作,然后执行。如果队列变大(至少在9.4及以下版本,可能会在将来更改),它们不会溢出到磁盘上,因此庞大的AFTER
触发器队列可能导致可用内存溢出,从而导致语句中止。
NEW
在插入/更新之前修改行的触发器比执行DML的触发器便宜。
您想要的特定用例将通过正在进行的增强而更好地执行,该增强可能会使其纳入PostgreSQL 9.5(如果幸运的话),其中FOR EACH STATEMENT
触发器可以看到虚拟OLD
和NEW
表。在当前的PostgreSQL版本中这是不可能的,因此您必须使用FOR EACH ROW
触发器。
之前有人尝试过吗?
当然。这是触发器,审计,健全性检查等的标准用法。
当任务表发生更改时,您需要研究一下LISTEN
并NOTIFY
找到一种唤醒工作人员的好方法。
通过避免直接从触发器与外部系统对话,您已经在做最重要的事情。这对于性能和可靠性而言往往是有问题的。人们经常尝试做一些事情,例如直接从触发器发送邮件,这是个坏消息。