近期要上一个BI的项目,需要对各个业务系统内的数据进行分析,那么问题就来了。现有的数据库中有新insert进来的数据,还会有对于已有的数据进行变更的操作。那么这些新增以及变化都要反应到BI系统中。
可以现有的生产数据库的table中没有可以识别变更的时间戳字段。如果对已有的表增加一个timestmap字段,在数据库层面上当然是非常容易办到的,一个简单的 "alter table add xxx column... " 即可。但是在业务程序方面将会带来巨大的改造量。
- insert的时候需要多增加一个timestmap字段
- update的时候需要同时更新timestmap字段
(这样的话,开发人员该疯了)
在MySQL数据库下可以添加一个会自动更新的timestamp。(oracle中不支持该语法)
alter table t2 add COLUMN T_MODIFY_TM timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT 'is_timestamp';
在oracle怎么办呢?
伪列ORA_ROWSCN
想啊想,oracle既然存在rownum , rowid 这样的伪列,会不会还有行的scn的伪列呢。。果然oracle有 ---- ORA_ROWSCN
SQL> select * from t2;
ID
----------
0
SQL> select ora_rowscn , id from t2;
ORA_ROWSCN ID
---------- ----------
3489228 0
SQL> insert into t2 values (2);
1 row created.
SQL> commit;
Commit complete.
SQL> select ora_rowscn , id from t2;
ORA_ROWSCN ID
---------- ----------
3489228 0
3489004 2
为了更方便阅读,还可以把scn的数字转换为时间
SQL> select to_char(scn_to_timestamp(ora_rowscn),'YYYY-MM-DD HH24:MI:SS') , id from t2;
TO_CHAR(SCN_TO