在 UPDATE 之后使用来自更新的数据调用 NOTIFY 创建 postgres 语句触发器

Create postgres statement trigger after UPDATE using data from the update to call NOTIFY

我想创建一个触发器,每当 table 上的 INSERT 语句成功时,它会 运行s,使用插入的数据调用 pg_notify :

CREATE OR REPLACE FUNCTION notify_updates() RETURNS TRIGGER AS $$
   BEGIN
    PERFORM pg_notify(NEW.aggregate_type, NEW.aggregate_id::text);
    RETURN NEW;
   END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE TRIGGER model_notification
 AFTER INSERT ON events
 FOR EACH STATEMENT
 EXECUTE PROCEDURE notify_updates()

aggregate_typeaggregate_idevents table 的列。 aggregate_type 的值是预先知道的,可以提前在相关频道上调用 LISTEN

我得到的错误是“频道名称不能为空”。我想这是因为每个语句而不是每一行的触发器 运行s。
有没有办法使它适用于语句触发器?我认为有趣的部分是可能插入了几行,而 postgres 不知道应该选择哪个值?

这个问题类似于 ,但我想在每个语句而不是每一行上都有触发器 运行,因为在我的特定情况下 aggregate_typeaggregate_id 对每个插入的所有行都是相同的。

您需要转换 table:

CREATE OR REPLACE FUNCTION notify_updates() RETURNS TRIGGER AS $$
   BEGIN
    PERFORM pg_notify(aggregate_type, aggregate_id::text)
      FROM new_table -- transition table
      LIMIT 1;       -- !!
    RETURN NEW;
   END;
$$ LANGUAGE plpgsql;

CREATE TRIGGER model_notification
 AFTER INSERT ON events
 REFERENCING NEW TABLE AS new_table -- define transition table name
 FOR EACH STATEMENT
 EXECUTE PROCEDURE notify_updates();

阅读文档中有关此功能的更多信息:

Transition tables 是在 Postgres 10 中引入的。另请阅读