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

Max*_*ian 24 oracle oracle-call-interface

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

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

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

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

Pau*_*aul 46

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

SELECT SCN_TO_TIMESTAMP(MAX(ora_rowscn)) from myTable;
Run Code Online (Sandbox Code Playgroud)

它足够接近我的目的.

  • 只要您的表的最后更新还没有很久以前工作.否则你会得到一个错误,所以最安全的做法是先在myTable.ora_rowscn <= tiemposmax.scn上执行:left join sys.smon_scn_time tiemposmax,然后将SCN_TO_TIMESTAMP应用到你的表的ora_rowscn中,当且仅当匹配时.否则,您可以从sys.smon_scn_time显示SCN_TO_TIMESTAMP(MIN(SCN)),作为之前修改表的最早日期. (6认同)

Jus*_*ave 37

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

默认情况下,ORA_ROWSCN实际上是在块级别维护,因此对块中任何行的更改将更改块中的ORA_ROWSCN所有行.如果我们要讨论的是"正常"的数据访问模式,那么如果打算在不进行任何更改的情况下最大限度地减少多次处理的行数,这可能就足够了.您可以重建表,ROWDEPENDENCIES以便ORA_ROWSCN在行级别跟踪,这将为您提供更精细的信息,但需要一次性重建表.

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

  • 什么是行被删除?我怎样才能知道? (2认同)

dub*_*dub 9

询问您的DBA有关审核的信息.他可以通过简单的命令开始审计,例如:

AUDIT INSERT ON user.table
Run Code Online (Sandbox Code Playgroud)

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

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

  • 谢谢。我想这就是它应该完成的方式。遗憾的是,“询问 DBA”往往相当复杂。他们对改变东西真的很偏执。我理解他们。如果这个数据库有任何问题,事情往往会变得丑陋。 (2认同)

gro*_*ter 8

SELECT * FROM all_tab_modifications;
Run Code Online (Sandbox Code Playgroud)

  • 这看起来是一个好主意,但实际上它有很多警告:并非所有 DML 都能保证得到反映,它不是即时的,可能需要运行“dbms_stats.flush_database_monitoring_info”以使其保持最新,在统计信息收集之后此视图中没有条目,并且**它已经记录了提交之前的更改**。 (2认同)

mwi*_*ams 7

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

看起来您可以使用ORA_HASH函数来完成此任务.

更新:另一个好的资源:10g的ORA_HASH函数,用于确定两个Oracle表的数据是否相等


小智 5

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

所以你甚至不用走到餐桌旁,而是坐下来等待叫号。只有当有需要修改的地方你才会去。

这称为数据库更改通知。正如贾斯汀提到的,它比 CDC 简单得多,但两者都需要一些花哨的管理内容。好的部分是,这些都不需要更改应用程序。

需要注意的是,CDC 适合大容量表,而 DCN 则不然。


hui*_*hen 5

如果服务器上启用了审计,只需使用

SELECT *
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_NAME IN ()
Run Code Online (Sandbox Code Playgroud)