我可以找出对Oracle数据库中的表执行最后一条INSERT,UPDATE或DELETE语句的时间吗?
背景知识:Oracle版本为10g。我有一个定期运行的批处理应用程序,可从单个Oracle表读取数据并将其写入文件。如果自上次运行作业以来数据未更改,我想跳过此步骤。
该应用程序用C++编写,并通过OCI与Oracle通信。它以“普通”用户身份登录到Oracle,因此我不能使用任何特殊的管理员内容。
编辑:好的,“Special Admin Stuff”并不是一个很好的描述。我的意思是:除了从表中选择和调用存储过程外,我什么也不能做。如果想在2010年之前完成更改数据库本身的任何事情(如添加触发器),则很遗憾。
请您参考如下方法:
由于您的体重是10克,因此有可能使用ORA_ROWSCN
伪列。这样,您就可以得出导致该行发生更改的最后一个SCN(系统更改号)的上限。由于这是一个递增的序列,因此您可以存储已看到的最大ORA_ROWSCN
,然后仅查找SCN大于该值的数据。
默认情况下,ORA_ROWSCN
实际上保持在块级别,因此更改块中的任何行都会更改该块中所有行的ORA_ROWSCN
。如果要在不考虑“正常”数据访问模式的情况下将多次处理的行数减至最少,而无需进行更改,那么这可能就足够了。您可以使用ROWDEPENDENCIES
重建表,这将导致在行级别跟踪ORA_ROWSCN
,这为您提供了更详尽的信息,但需要一次性的精力来重建表。
另一种选择是配置诸如更改数据捕获(CDC)之类的内容,并使OCI应用程序成为对表进行更改的订阅者,但这还需要一次性的精力来配置CDC。