Ric*_*nop 2 postgresql netezza
是否有可能以某种方式找出从表中删除的行的主键?
同样,是否可以找出表中更新的行的主键?
让我们考虑一个简单的用例:
我有两个时间戳:
给我这两个时间戳之间更新/删除的所有行的主键.
表格中没有任何信息表明它们已经更新.
不,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扩展,因为你必须在表上进行"脏读".
| 归档时间: |
|
| 查看次数: |
3009 次 |
| 最近记录: |