如何找出上次更新Oracle表的时间

时间:2008-11-05 13:26:03

标签: oracle oci

我可以找出在Oracle数据库中的表上执行最后一次INSERT,UPDATE或DELETE语句的时间吗?如果是,怎么做?

一点背景:Oracle版本为10g。我有一个定期运行的批处理应用程序,从单个Oracle表中读取数据并将其写入文件。如果自上次作业运行以来数据没有变化,我想跳过这个。

应用程序是用C ++编写的,并通过OCI与Oracle通信。它使用“普通”用户登录Oracle,因此我无法使用任何特殊管理员。

编辑:好的,“特别管理员资料”并不是一个很好的描述。我的意思是:除了从表中调用和调用存储过程之外,我什么也做不了。如果想在2010年之前完成任务,那么改变数据库本身的任何内容(比如添加触发器)都是不可思议的选择。

11 个答案:

答案 0 :(得分:44)

我参加这个派对的时间已经很晚了但是我的表现就是这样:

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;

它足够接近我的目的。

答案 1 :(得分:36)

由于您使用的是10g,因此可能会使用ORA_ROWSCN伪列。这将为您提供导致行更改的最后一个SCN(系统更改编号)的上限。由于这是一个递增的序列,您可以存储您已经看到的最大ORA_ROWSCN,然后只查看SCN大于该值的数据。

默认情况下,ORA_ROWSCN实际上是在块级别维护的,因此对块中任何行的更改都将更改块中所有行的ORA_ROWSCN。如果我们要讨论的是“正常”的数据访问模式,那么如果打算在没有任何更改的情况下最小化您多次处理的行数,这可能就足够了。您可以使用ROWDEPENDENCIES重建表格,这将导致在行级别跟踪ORA_ROWSCN,这会为您提供更详细的信息,但需要一次性重建表格。

另一种选择是配置诸如变更数据捕获(CDC)之类的东西,并使您的OCI应用程序成为对表的更改的订阅者,但这也需要一次性配置CDC。

答案 2 :(得分:9)

向您的DBA询问审核情况。他可以通过简单的命令开始审计:

AUDIT INSERT ON user.table

然后您可以查询表USER_AUDIT_OBJECT以确定自上次导出以来您的表上是否有插入。

google for Oracle审核了解更多信息...

答案 3 :(得分:8)

SELECT * FROM all_tab_modifications;

答案 4 :(得分:7)

你能在结果上运行某种校验和并在本地存储吗?然后,当您的应用程序查询数据库时,您可以比较其校验和并确定是否应该导入它?

看起来您可以使用ORA_HASH功能来完成此任务。

更新:另一个好资源:10g’s ORA_HASH function to determine if two Oracle tables’ data are equal

答案 5 :(得分:4)

Oracle可以监视表的更改以及何时发生更改可以在PL / SQL或OCI中执行回调函数。回调获取一个对象,该对象是已更改的表的集合,并且具有已更改的rowid集合以及操作类型Ins,upd,del。

所以你甚至不去桌子,你坐着等待被召唤。如果有更改要写,你才会去。

它被称为Database Change Notification。它比Justin提到的CDC简单得多,但两者都需要一些花哨的管理员资料。好的部分是这些都不需要对APPLICATION进行更改。

需要注意的是,CDC适用于高容量表,DCN不适用。

答案 6 :(得分:2)

如果在服务器上启用了审核,则只需使用

SELECT *
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_NAME IN ()

答案 7 :(得分:1)

您需要在insert,update,delete上添加一个触发器,将另一个表中的值设置为sysdate。

当你运行应用程序时,它会读取值并将其保存到某个地方,以便下次运行时它有一个比较引用。

你会考虑“特别行政人员的东西”吗?

最好描述一下你的实际行动,以便得到更明确的答案。

答案 8 :(得分:1)

批处理过程需要多长时间才能写入文件?最简单的方法就是让它继续下去,然后将文件与上一次运行中的文件副本进行比较,看看它们是否相同。

答案 9 :(得分:0)

如果有人仍在寻找答案,他们可以使用Oracle 10g附带的Oracle Database Change Notification功能。它需要CHANGE NOTIFICATION系统权限。您可以注册侦听器何时触发返回应用程序的通知。

答案 10 :(得分:-4)

请使用以下声明

select * from all_objects ao where ao.OBJECT_TYPE = 'TABLE'  and ao.OWNER = 'YOUR_SCHEMA_NAME'