Postgres 触发器代码不会从函数中读取 OLD 表记录

发布于 2025-01-11 13:40:36 字数 670 浏览 0 评论 0原文

我们有一个 Postgres 数据库,我们希望记录更新何时更改预算记录类型。我们有一个触发器函数来记录对 UPDATE 调用的这些记录的更改。当我们运行更新函数时,触发器会写入记录,就好像每个记录都已从 0 更新到其当前值,而不是仅在更改时触发。

例如,如果我们当前存储的预算值为 20 并将其更新为 30,我们预计触发器会触发并报告从 20 到 30 的更改。如果我们将该值更新为 20(即未更改),我们预计触发器不会触发开火。但是,在第一种情况下,触发器记录从 0 到 30 的更新,而在第二种情况下,触发器记录从 0 到 20 的更新。

只有当我们从更新函数中调用触发器时,才会发生这种情况。使用简单的 UPDATE TABLE... 语句调用,它会正确响应,不会在第二种情况下触发并在第一种情况下记录从 20 到 30 的更改。

我们尝试在更新之前和之后放置触发器,这没有什么区别(因为谷歌搜索表明,如果在更新之后调用触发器,则新记录可能会出现问题,所以我们认为让我们尝试任一方式)。

更新函数使用“INSERT things FROM view ON CONFLICT DO UPDATE other things”结构,但在简单的测试语句中使用相同的代码,因此在函数之外不会引起问题 - 触发器不会在第二个实例中触发并在第一个记录20到30个。

Postgres 是版本 12,我们处于企业环境中,因此没有 dba 访问权限,也无法升级版本。

We have a Postgres database and we want to record when updates change a budget record type. We have a trigger function to record changes to these records called on UPDATE. When we run the update function, the trigger writes records as though every record has been updated from 0 to its current value rather than only firing on changes.

So for instance, if we have a budget value of 20 currently stored and update that to 30 we expect the trigger to fire and report a change from 20 to 30. If we update the value to 20 (ie unchanged) we expect the trigger not to fire. However, in the first case the trigger records an update from 0 to 30 and in the second from 0 to 20.

This only happens when we call the trigger from within the update function. Called using a simple UPDATE TABLE... statement, it responds correctly, not firing in the second case and recording a change from 20 to 30 in the first.

We have tried positioning the trigger both before and after the update and it makes no difference (since a google search suggested there might be a problem with the NEW record if the trigger was called after so we figured let's try either way).

The update function uses an "INSERT things FROM view ON CONFLICT DO UPDATE other things" structure but using identical code in a simple test statement, so outside the function, does not give rise to problems -- the trigger does not fire in the second instance and records 20 to 30 in the first.

Postgres is version 12 and we're in a corporate environment so don't have dba access nor can we upgrade versions.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文