问题解答 -- 如何得知一张表的纪录有变化?
DBA » http://www.anysql.net/dba/capture_table_row_change.html 2007-07-17网上有一个问题, 要想知道那些表记录发生了变化? 对于一些更新不是很多(一秒种有几百条上下的)的表, 我会建议用实体化视图日志(Materialize View Log/Snapshot Log)去实现. 其基本原理是能过一个内部(Internal)的内核(Kernal)一级的行级触发器(Row Level Trigger), 将变化过的记录的ROWID或主键值保存到另一个表中去. 实体化视图的增量刷新(Fast Refresh)正是基于这个技术.
假设我们需要监控的表名为T_OBJECTS, 主键为OBJECT_ID, 如果没有主键则用ROWID, 则可以用如下语句来创建实体化视图日志.
-- Using Primary Key
CREATE MATERIALIZED VIEW LOG ON T_OBJECTS
TABLESPACE users WITH PRIMARY KEY, SEQUENCE;
-- Using ROWID
CREATE MATERIALIZED VIEW LOG ON T_OBJECTS
TABLESPACE users WITH ROWID, SEQUENCE;
这时会在Oracle中生成一个MLOG$_T_OBJECTS的表, 包含如下有用字段:
SEQUENCE$$ -- Operation Order
DMLTYPE$$ -- Operation Type, U=Update/I=Insert/D=Delete
M_ROW$$ -- ROWID of affected row,
OBJECT_ID -- The primary key values in this case
我用ROWID类型的做了实验, 先做了一条Insert, 再做了一条Delete, 然后查询日志表记录:
SQL> SELECT SEQUENCE$$, M_ROW$$, DMLTYPE$$ FROM MLOG$_T_OBJECTS;
SEQUENCE$$ M_ROW$$ D
---------- -------------------- -
1 AAACYhAAEAAAEFvAAA I
2 AAACYhAAEAAACOMAAA D
更复杂的例子就自已去设计了. 如果搞懂了这些, 还可以自已写角本从Oracle向其他的数据库进行数据复制呢.


如果是10g的话使用Flashback Versions Query也可以实现这个目的。
如果在10.2 版本以上,可以考虑
Database Change Notification