在一个Postgres触发器中,是否有可能发现一个给定的列是否已经包含在UPDATE列表中,即使值没有改变?我正在查找与SQL Server中的UPDATE()
函数(https://learn.microsoft.com/en-us/sql/t-sql/functions/update-trigger-functions-transact-sql)等效的函数
我知道我可以创建一个触发器,它只在给定的列已更新时才运行,但我希望相反,只在列尚未更新时才触发。
我有一个在INSERT和UPDATE操作上运行的触发器。正如我所说的,我希望它只在指定了给定的列 NOT 时才运行。对于INSERT,这很容易,因为我可以检查NEW.column IS NULL
,但如何检查UPDATE?我不能只检查NEW.column != OLD.column
,因为我特别希望它 * 不运行 *,如果列已经设置为相同的值,它应该只运行,如果列 * 没有被包括 * 在UPDATE列表中。
背景是我们有一个自动设置的source
列。应用层UPSERT不设置这个值,所以我们有一个触发器来设置它。我们也有一些postgres函数可以被调用,这些函数会导致其他UPSERT,这些函数将设置source
列。目前在这些函数中,我们禁用触发器,UPSERT数据,然后重新启用触发器。然而,我们发现触发器disable/reenable会导致锁定问题,因此我们正在寻找一种方法来避免这一步。通过仅在UPSERT上未指定source
列时触发,我们可以避免禁用/重新启用。
1条答案
按热度按时间8gsdolmq1#
Postgres没有任何直接等价物。但是,它确实提供了
when
的create trigger条件。Postgres还提供了is [not] distinct from
predicate /子句,可以更好地处理空值。在when子句create触发器上使用它:---更新---你的意图是什么?是不触发触发器还是抑制更新?当特定列被更新但值未被更改而其他列被更改时,会发生什么情况?我将答案更改为仅在更改时触发,但更新仍会发生,但触发器不会触发。参见demo here。请注意,在演示中,第二次更新不会更改指定列(
test_value
)的值,但会更改另一列(note
)。但是,它不会在表“trigger_log”中创建指示触发器未激发的行。