当前位置: 首页 > 面试题库 >

在Postgres更新触发器中检测列更改

史淇
2023-03-14
问题内容

我有一个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)如果您只想要按键,则可以使用。



 类似资料:
  • 问题内容: 我有两个叫和的表。我想创建一个触发器,更新列上在每个新的插入表的表。 表客户:customer_id,名称,last_sale,… 表销售额:sale_id,customer_id,日期,… 我已经开始写作,但我不知道该怎么做。 有人可以帮我吗? 问题答案: 然后 是即将在销售表中插入的行。(对于更新行,将取决于该行在更新之后的外观,以及该行在更新之前的外观)。

  • userNotesTable: 用户提醒表: 插入触发器: 更新触发器: 这是数据库的当前代码,以及提醒表的特定触发器。我遇到的困难是,从提醒表中的specific中的user notes表中选择特定的名称和额外的内容,所有这些都在更新触发器中。 插入时,和会被插入到提醒和搜索表中,但我希望能够使用特定名称和用户注释表中的额外内容更新搜索表,这可能吗?

  • 问题内容: 在oracle中,我可以指定列,这将引发触发器的触发: 现在,我想执行以下操作:当 只 更新 一 列时,我不希望触发触发器。这怎么可能? 我可以列出除那一列之外的所有列,该列不应引起触发器的触发。对于具有许多列的表而言,这非常麻烦。 另一种方法是使用像这样的UPDATING函数: 但是,如果我立即更改了COL1 和 COL3,则该语句的计算结果为false。那不是我想要的,因为我只想更

  • 问题内容: 我正在尝试为我的表创建一个触发器,该触发器根据某个标志设置为“ Y”的时间自动添加发布日期 我没有创建触发器的丰富经验,但到目前为止,这是我所拥有的 更新列时出现此错误 触发器“ USER.ADD_CREATE_DT”无效且重新验证失败 有任何想法吗? 谢谢 问题答案: 使用WHEN子句: 或使用IF: 在这种情况下,WHEN更合适,更有效。

  • 问题内容: 在同一张表上更新后,如何在触发器中更新表的列? 这是触发条件: 现在当我像这样更新表时 这不起作用,因为我得到以下信息: 那么我到底该如何工作呢? 问题答案: 如果将触发器更改为而不是,可以这样操作:

  • 问题内容: 我对基于SQL Server 2000的旧应用程序进行了一些调整,不用说,我只想做绝对最小的操作,以免它可能会崩溃。 我有一个很大的用户表tbUsers,带有IsDeleted的BIT标志。我想将所有当前和将来的IsDeleted = 1个用户记录归档到我的归档表tbDeletedUsers中。 移动当前已删除的用户很简单,但是我想要一种方法来移动设置了IsDeleted标志的所有将来