跟踪oracle中数据更改的最佳方法

跟踪oracle中数据更改的最佳方法,oracle,triggers,oracle9i,materialized-views,cdc,Oracle,Triggers,Oracle9i,Materialized Views,Cdc,正如我所说的标题,跟踪oracle中数据更改的最佳方法是什么?我只想知道更新/删除/插入的是哪一行 起初我考虑触发器,但我需要在每个表上写更多的触发器,然后将影响的rowid记录到我的更改表中,这不好,然后我在Google中搜索,学习有关物化视图日志和更改数据捕获的新概念 物化视图日志对我来说很好,我可以将它与原始表进行比较,然后我可以得到不同的记录,甚至是不同的字段,我认为从原始表创建/复制新表的方法是一样的(但我不知道有什么不同?) 更改数据捕获组件对我来说很复杂:),所以我不想浪费时间研究

正如我所说的标题,跟踪oracle中数据更改的最佳方法是什么?我只想知道更新/删除/插入的是哪一行

起初我考虑触发器,但我需要在每个表上写更多的触发器,然后将影响的rowid记录到我的更改表中,这不好,然后我在Google中搜索,学习有关物化视图日志和更改数据捕获的新概念

物化视图日志对我来说很好,我可以将它与原始表进行比较,然后我可以得到不同的记录,甚至是不同的字段,我认为从原始表创建/复制新表的方法是一样的(但我不知道有什么不同?)


更改数据捕获组件对我来说很复杂:),所以我不想浪费时间研究它


任何人都有在oracle中跟踪数据更改的最佳方法的经验吗?

您将想看看该语句。它收集SYS.AUD$表中的所有审核记录

例如:

AUDIT insert, update, delete ON t BY ACCESS
问候,

罗伯。

你可能想看看金门。这使得捕获更改变得很简单,价格低廉,但性能好,安装速度快

如果性能没有问题,触发器和审计可能是一个有效的解决方案。 如果性能是一个问题,金门被认为过于昂贵,您也可以使用Logminer或更改数据捕获。如果有这个选择,我会选择CDC。 如您所见,有很多选择,近实时和离线


手工编写解决方案也是有代价的,金门是值得研究的。

Oracle通过重做日志为您完成这项工作,这取决于您如何处理这些信息。我假设您需要的是复制(跟踪源实例上的更改并传播到一个或多个目标实例)

如果是这种情况,您可以考虑Oracle流(其他选项,如高级复制,但您需要考虑您的需要):

来自Oracle:

使用流时,复制 DML或DDL更改通常包括 三个步骤:

捕获过程或应用程序 创建一个或多个逻辑更改 记录(LCR)并将其排入 排队。LCR是带有 描述一个应用程序的特定格式 数据库更改。捕获过程 重新格式化从中捕获的更改 重做登录到LCR和应用程序 可以构造LCR。如果改变是 数据操作语言(DML) 操作,然后每个LCR封装 由DML导致的行更改 在上对共享表执行操作 源数据库。如果变化是一个 数据定义语言(DDL) 操作,然后LCR封装 对的DDL更改 源上的共享数据库对象 数据库

传播会传播阶段化的数据 LCR到另一个队列,通常 驻留在独立的数据库中 从LCR所在的数据库 捕获。LCR可以传播到 在它到达之前的许多队列 在目标数据库中

在目标数据库中,应用 进程通过以下方式消耗更改: 将LCR应用于共享 数据库对象。应用过程可以 退出LCR队列并直接应用它, 或者,应用进程可以将 LCR并将其发送给应用处理程序。 在Streams复制环境中, 应用处理程序执行自定义的 处理LCR,然后应用 共享数据库对象的LCR


谢谢你,我认为金门是个好工具,但我是自由人“更改数据捕获组件对我来说很复杂:),所以我不想浪费时间来研究它。”如果它是适合您案例的正确解决方案呢?嗨,Rajesh,现在我有了一个新想法。我从名为xxx的原始表中创建了名为xxx\u CT的新表,xxx\u CT只有主键和rowserion字段,然后我可以通过以下角色获取更改行:new:in xxx,但不in xxx\u CT UPDATE:in xxx和xxx\u CT,但行版本不同删除:在xxx中,但不是在xxx中,然后我可以合并这些there语句以获得更改行。我研究了审计,它将记录非常详细的信息,这是为审计而不是我。:)没关系。尽管它完美地回答了您的“我只想知道更新/删除/插入了哪一行”。