是否有可能以某种方式找出从表中删除的行的主键?
同样,是否可以找出表中更新的行的主键?
让我们考虑一个简单的用例:
我有两个时间戳:
给我这两个时间戳之间更新/删除的所有行的主键。
表格中没有任何信息表明它们已被更新。
答案 0 :(得分:5)
不,PostgreSQL没有提供类似内置的东西。
要做到这一点,它必须浪费空间和I / O跟踪大多数人永远不会需要的东西。
如果您的主键是连续且单调的,那么您可以在generate_series
上执行左反连接以找到漏洞。但是,如果你使用serial
(即一个序列)来生成密钥,这将无法工作,因为任何回滚都会创建一个间隙,即使实际上没有插入任何内容以便随后被删除
您需要添加审核触发器,以将要跟踪的操作记录到单独的审核表中。你不能追溯地做到这一点;你无法审核过去已有的事情。到目前为止,这是最简单的选择。
另一个常见的解决方案是将行标记为"删除"在应用程序级别,实际上没有从表中删除它们。例如,您可以在表格中设置deleted_at
和deleted_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
这个技巧对于恢复错误非常有用。请注意,在reclaim
或groom
后,已删除的记录不再保留。