有没有办法知道postgreSQL中语句级别触发器中哪些行被更改?

时间:2013-11-20 19:30:00

标签: postgresql

我必须编写一个语句级别触发器,如果​​值在24小时内更改,我需要知道列的方式。 例如,我的表有三列Col_1 | Col2 | Col3,我想知道更新操作是否导致col_1中的任何更改,并希望将该值存储在单独的表中。我不想使用行级触发器,因为更新可能会导致更改表中的许多行。 我知道在oracle中我们可以使用复合触发器并使用语句级别触发器实现相同的功能。但对postgres用户的任何建议。

非常感谢!!

1 个答案:

答案 0 :(得分:1)

在行级触发器上,您可以知道,并且实际上在触发事件之前检查它:

create trigger foo after update on foo
for each row
when (row(old.col1, old.col2, …) is distinct from row(new.col1, new.col2, …))
execute procedure foo_upd();

声明级别触发器不提供此类可能性,因为它们会对表格上的任何相关声明触发。

然而,在实际需要的奇怪和不寻常的情况下,你有两个选择:

  1. 您可以在行级触发器中创建临时表,在根据需要更改行时填充它,并从那里获取语句级触发器。
  2. 您可以检查表中每行的txid。它是一个隐藏字段,如果等于当前事务,则意味着该行被触摸。 (不一定更新;只是触及。)