美文网首页
【转】关于获取oracle中数据变更的时间戳的探索(待更新)

【转】关于获取oracle中数据变更的时间戳的探索(待更新)

作者: 白云v城主 | 来源:发表于2019-12-24 13:31 被阅读0次

    关于获取oracle中数据变更的时间戳的探索(待更新)

    近期要上一个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_TIME         ID
    ------------------- ----------
    2018-02-26 10:40:28          0
    2018-02-28 10:35:45          2
    
    

    Scn转换成时间:

    select to_char(scn_to_timestamp(3489228),'YYYY-MM-DD HH24:MI:SS') from dual;
    
    

    时间转换成scn:

    select timestamp_to_scn(to_date('2011-04-14 11:10:25','YYYY-MM-DD HH24:MI:SS')) from dual;
    
    

    简单的测试,结果很令人开心哈,毕竟不用改程序了。(我为人人做贡献的DBA)

    开始在业务测试库中进行验证。

    相关文章

      网友评论

          本文标题:【转】关于获取oracle中数据变更的时间戳的探索(待更新)

          本文链接:https://www.haomeiwen.com/subject/blzxoctx.html