我正在研究内部ETL解决方案,从db1(Oracle)到db2(Sybase)。我们需要逐步传输数据(Change Data Capture?)到db2。
我只能读取对表的访问权限,因此我无法在Oracle db1中创建任何表或触发器。
我面临的挑战是,如何在Oracle中检测记录删除?
我能想到的解决方案是使用额外的独立/嵌入式数据库(例如derby,h2等)。此数据库包含2个表,即old_data,new_data。
old_data包含Oracle中感兴趣的主要关键字段。
每次运行ETL过程时,都会使用Oracle表中的主键字段填充new_data表。之后,我将运行以下sql命令来获取已删除的行:
SELECT old_data.id FROM old_data WHERE old_data.id NOT IN (SELECT new_data.id FROM new_data)
我认为当数据量变得非常大时,这将是一项非常昂贵的操作。你有更好的想法吗?
感谢。
答案 0 :(得分:4)
哪个版本的Oracle?如果您有Enterprise Edition,请查看Oracle Streams。 您可以从REDO日志而不是数据库本身中删除删除
答案 1 :(得分:0)
您可以采用的一种方法是使用Oracle闪回功能(如果您使用的是版本9i或更高版本):
http://forums.oracle.com/forums/thread.jspa?messageID=2608773
这将允许您从先前的数据库状态中进行选择。
如果可能无法始终删除记录,则可以通过以下方式提高效率:
如果闪回不是一个选项,请快速记下你的解决方案:我不认为你的选择查询是一个大问题 - 所有那些插入来填充那些真正需要花费很多时间的边表。为什么不在更新之前对sybase生产服务器运行该查询?