找出删除和更新的行

Ric*_*nop 2 postgresql netezza

是否有可能以某种方式找出从表中删除的行的主键?

同样,是否可以找出表中更新的行的主键?

让我们考虑一个简单的用例:

我有两个时间戳:

  • 开始
  • 结束

给我这两个时间戳之间更新/删除的所有行的主键.

表格中没有任何信息表明它们已经更新.

Cra*_*ger 5

不,PostgreSQL没有提供类似内置的东西.

要做到这一点,它必须浪费空间和I/O跟踪大多数人永远不会需要的东西.

如果你的主键是连续的和单调的,那么你可以只做一个左反连接generate_series来找到漏洞.但是,如果您正在使用serial(即序列)生成键,则这将不起作用,因为任何回滚都会产生间隙,即使实际上没有插入任何内容以便随后被删除.

您需要添加审计触发器,以将要跟踪的操作记录到单独的审计表中.你不能追溯地做到这一点; 你无法审核过去的事情.到目前为止,这是最简单的选择.

另一个常见的解决方案是在应用程序级别将行标记为"已删除",而不实际从表中删除它们.例如,您可以在表中设置一个deleted_atdeleted_by字段.您甚至可以使用带ON INSERT OR UPDATE OR DELETE DO INSTEAD触发器的视图使此应用程序透明.

pg_audit在开发中还有一个扩展,以使这更容易,但它还没有准备好.


半相关的注意事项:在PostgreSQL 9.5中,我认为对于最近删除的行,在VACUUM使用C扩展进行清理之前,这实际上是可能的.9.5将能够记录提交的时间戳,9.4及以下不提交(它们只记录事务ID).因此,您可以通过检查xmax并从那里找出删除了哪一个事务ID ,确定它被删除的时间戳.你需要一个C扩展,因为你必须在表上进行"脏读".