找出删除和更新的行

时间:2014-07-22 08:30:48

标签: postgresql netezza

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

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

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

我有两个时间戳:

  • 启动

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

表格中没有任何信息表明它们已被更新。

2 个答案:

答案 0 :(得分: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扩展,因为你必须做一个"脏读"在桌子上。

答案 1 :(得分:1)

使用Netezza,不仅可以提取主键,还可以删除已删除的所有数据。

首先运行命令以公开已删除的记录
set show_deleted_records=true;

然后查询数据库。

Select deletexid,*
 from table_name
 where deletexid>0

这个技巧对于恢复错误非常有用。请注意,在reclaimgroom后,已删除的记录不再保留。