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)
它足够接近我的目的.
Jus*_*ave 37
由于你是10g,你可能会使用ORA_ROWSCN伪列.这将为您提供导致行更改的最后一个SCN(系统更改编号)的上限.由于这是一个递增的序列,您可以存储ORA_ROWSCN您看到的最大值,然后仅查看SCN大于该值的数据.
默认情况下,ORA_ROWSCN实际上是在块级别维护,因此对块中任何行的更改将更改块中的ORA_ROWSCN所有行.如果我们要讨论的是"正常"的数据访问模式,那么如果打算在不进行任何更改的情况下最大限度地减少多次处理的行数,这可能就足够了.您可以重建表,ROWDEPENDENCIES以便ORA_ROWSCN在行级别跟踪,这将为您提供更精细的信息,但需要一次性重建表.
另一种选择是配置诸如变更数据捕获(CDC)之类的东西,并使您的OCI应用程序成为对表的更改的订阅者,但这也需要一次性配置CDC.
询问您的DBA有关审核的信息.他可以通过简单的命令开始审计,例如:
AUDIT INSERT ON user.table
Run Code Online (Sandbox Code Playgroud)
然后,您可以查询表USER_AUDIT_OBJECT以确定自上次导出以来您的表上是否有插入.
google for Oracle审核了解更多信息......
SELECT * FROM all_tab_modifications;
Run Code Online (Sandbox Code Playgroud)
你能在结果上运行某种校验和并在本地存储吗?然后,当您的应用程序查询数据库时,您可以比较其校验和并确定是否应该导入它?
看起来您可以使用ORA_HASH函数来完成此任务.
更新:另一个好的资源:10g的ORA_HASH函数,用于确定两个Oracle表的数据是否相等
如果服务器上启用了审计,只需使用
SELECT *
FROM ALL_TAB_MODIFICATIONS
WHERE TABLE_NAME IN ()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
207043 次 |
| 最近记录: |