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

有没有办法知道postgreSQL语句级触发器中更改了哪些行?,postgresql,Postgresql,我必须编写一个语句级触发器,在该触发器中,我需要知道如果值在24小时内更改,列的情况如何。 例如,我的表有三列Col|u 1 | Col2 | Col3,我想知道更新操作是否导致Col|1发生任何更改,并希望将该值存储在单独的表中。我不想使用行级触发器,因为更新可能会导致表中许多行发生更改。 我知道在oracle中,我们可以使用复合触发器,并通过语句级触发器实现相同的功能。但是对postgres用户的任何建议 非常感谢 对于行级触发器,您可以知道,事实上,在触发事件之前检查它: create t

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


非常感谢

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

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();
语句级触发器不提供这种可能性,因为它们是在表中的任何相关语句上触发的

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

  • 您可以在行级触发器中创建一个临时表,在需要更改行时填充它,并让语句级触发器从此处获取它
  • 您可以检查表中每行的txid是否正确。它是一个隐藏字段,如果等于当前事务,则表示该行已被触及。(不一定要更新;只是触摸一下。)

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

    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();
    
    语句级触发器不提供这种可能性,因为它们是在表中的任何相关语句上触发的

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

  • 您可以在行级触发器中创建一个临时表,在需要更改行时填充它,并让语句级触发器从此处获取它
  • 您可以检查表中每行的txid是否正确。它是一个隐藏字段,如果等于当前事务,则表示该行已被触及。(不一定要更新;只是触摸一下。)