【发布时间】:2014-05-21 16:08:53
【问题描述】:
我有一个 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 块变量),有一种方法可以在通知块中获取表的架构,而不会造成太严重的性能开销(因为这些表将得到更新公平一点)。
【问题讨论】:
标签: sql postgresql plpgsql