在 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_type
和 aggregate_id
是 events
table 的列。 aggregate_type
的值是预先知道的,可以提前在相关频道上调用 LISTEN
。
我得到的错误是“频道名称不能为空”。我想这是因为每个语句而不是每一行的触发器 运行s。
有没有办法使它适用于语句触发器?我认为有趣的部分是可能插入了几行,而 postgres 不知道应该选择哪个值?
这个问题类似于 ,但我想在每个语句而不是每一行上都有触发器 运行,因为在我的特定情况下 aggregate_type
和 aggregate_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 中引入的。另请阅读
我想创建一个触发器,每当 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_type
和 aggregate_id
是 events
table 的列。 aggregate_type
的值是预先知道的,可以提前在相关频道上调用 LISTEN
。
我得到的错误是“频道名称不能为空”。我想这是因为每个语句而不是每一行的触发器 运行s。
有没有办法使它适用于语句触发器?我认为有趣的部分是可能插入了几行,而 postgres 不知道应该选择哪个值?
这个问题类似于 aggregate_type
和 aggregate_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 中引入的。另请阅读