轮询Oracle DB以进行更改

时间:2009-12-10 22:18:08

标签: c# oracle plsql

我试图找出如何在不使用触发器的情况下轮询对Oracle表所做的更改。我目前关心的唯一变化是新/插入的记录。任何建议将不胜感激。

我也不想真正使用其他表来跟踪已发生的变化。

谢谢!

取值

4 个答案:

答案 0 :(得分:4)

CDC是一种选择,但如果您只是编写需要通知新数据的应用程序,那么这可能会有点沉重,Data Change Notification可能是更合适的解决方案。这也避免了轮询数据库的需要,因为数据库可以通知应用程序更改。

您还可以使用Streams将更改记录发送到应用程序。

如果您真的想要轮询该表,并假设您使用的是10g或更高版本,则可以使用ORA_ROWSCN伪列。默认情况下,这将为您提供特定块的最后一次更改的近似SCN(系统更改编号)。如果你不关心得到一些虚假的行,那可能就足够了。如果在启用ROWDEPENDENCIES的情况下重建表,则将在行级别而不是在表级别跟踪ORA_ROWSCN。当然,由于ORA_ROWSCN未编入索引,因此检索自特定SCN以来已修改的行将需要进行表扫描。使用序列生成的主键或表中的CREATED_DATE列来跟踪插入行的时间可能会更好。

答案 1 :(得分:1)

您可以使用Oracle的Change Data Capture

  

Change Data Capture可以有效地识别和捕获已添加,更新或从Oracle数据库关系表中删除的数据,并使更改数据可供应用程序使用。

     

数据仓库通常涉及从一个或多个源数据库中提取和传输关系数据到数据仓库中进行分析。 Change Data Capture可以快速识别和处理已更改的数据,而不是整个表,并使更改数据可供进一步使用。

     

更改数据捕获不依赖于中间平面文件来将数据分级到关系数据库之外。它捕获由对用户表执行的INSERT,UPDATE和DELETE操作产生的更改数据。然后将更改数据存储在称为更改表的数据库对象中,并以受控方式使更改数据可供应用程序使用。

答案 2 :(得分:0)

我不确定这是否是您正在寻找的,但您可以检查max rowid并确定自上次检查后哪些记录是新的。如果仅插入行而不删除行,则此方法应该有效。

例如: 从your_table中选择MAX(rowid); 要么 从your_table中选择rowid,其中rowid> last_max;

答案 3 :(得分:0)

如果使用ROWDEPENDENCIES子句创建表,则可以使用ORA_ROWSCN伪列来标识已更改的行。

这是一张表

SQL> create table t23
  2  (name varchar2(10)
  3   , id number
  4  ) rowdependencies
  5  /

Table created.

SQL> insert into t23 values ('SAM-I-AM', 1)
  2  /

1 row created.

SQL> insert into t23 values ('KNOX', 2)
  2  /

1 row created.

SQL> insert into t23 values ('FOX', 3)
  2  /

1 row created.

SQL> insert into t23 values ('LORAX', 9)
  2  /

1 row created.

SQL> select ora_rowscn, id, rowid from t23
  2  /

ORA_ROWSCN         ID ROWID
---------- ---------- ------------------
                    1 AAB72FAAEAAA+4cAAA
                    2 AAB72FAAEAAA+4cAAB
                    3 AAB72FAAEAAA+4cAAC
                    9 AAB72FAAEAAA+4cAAD

SQL> commit
  2  /

Commit complete.

SQL> select ora_rowscn, id, rowid from t23
  2  /

ORA_ROWSCN         ID ROWID
---------- ---------- ------------------
  75288125          1 AAB72FAAEAAA+4cAAA
  75288125          2 AAB72FAAEAAA+4cAAB
  75288125          3 AAB72FAAEAAA+4cAAC
  75288125          9 AAB72FAAEAAA+4cAAD

SQL> 

不需要提交获取行SCN。现在让我们进行进一步的更改,并使用ORA_ROWSCN来确定哪些行已更改...

SQL> update t23
  2  set name = 'MR KNOX'
  3  where id = 2
  4  /

1 row updated.

SQL> insert into t23 values ('SALLY', 6)
  2  /

1 row created.

SQL> commit;

Commit complete.

SQL> select ora_rowscn, id, rowid from t23
  2  where ora_rowscn > 75288125
  3  /

ORA_ROWSCN         ID ROWID
---------- ---------- ------------------
  75288182          2 AAB72FAAEAAA+4cAAB
  75288182          6 AAB72FAAEAAA+4cAAE

SQL> 
10g引入了

ORA_ROWSCNFind out more.

您需要一份工作来轮询表格以进行更改。您还需要构建一个表 其中轮询作业可用于存储每次运行的max(ora_rowscn)