我有一个postgres数据库,其中包含几个要监视其更新的表,并且如果有任何更新,则要触发“嘿,某些更改”更新。这在基本情况下有效,但是现在是时候进行改进了。
CREATE FUNCTION notify_update() RETURNS trigger AS $notifyfunction$ BEGIN PERFORM pg_notify('update_watchers', $${"event":"update", "type": "$$ || TG_TABLE_NAME || $$", "payload": {"id": $$ || new.id || $$}}$$); RETURN new; END; $notifyfunction$ LANGUAGE plpgsql;
效果很好。我将其附着在桌子上,如下所示:
CREATE TRIGGER document_update_body AFTER UPDATE ON documents FOR EACH ROW EXECUTE PROCEDURE notify_update();
(作为一个附带的问题:如果有比触发函数中的mess’o’$$更好/更容易的方法来对触发结果进行json.stringify的字符串化,请让我知道。平衡引号并不有趣)。
我要执行的操作是将附加到pg_notify的列的列表更改。它没有 看起来 像有什么简单的办法比表中遍历列和检查,如果NEW.col是OLD.col明显要做到这一点其他的。这样做的不好方法是在我的通知过程中硬编码列名(易碎,如果更改架构,则需要更新其他内容,等等)。
的确,我也不擅长编写plpgsql,所以我不确定在哪里寻求帮助。理想情况下,(如果没有我在文档中没有看到的updated_columns块变量),有一种方法可以将表的模式获取到通知块内,而又不会导致过多的性能开销(因为这些表将被更新公平的位)。
阅读hstore扩展。特别是,您可以从一行创建一个hstore,这意味着您可以执行以下操作:
changes := hstore(NEW) - hstore(OLD); ...pg_notify(... changes::text ...)
这比您想要的信息多一些(包括新值)。akeys(changed)如果您只想要按键,则可以使用。
akeys(changed)