海盗旗
作者海盗旗·2012-05-26 16:57
数据库管理员·OK

DB2 V10 新特性Time Travel Query应用范例

字数 4562阅读 1920评论 0赞 0
1、创建一个具有SYSTEM_TIME时间段的表
    此表包括指示一行中的数据为当前数据的属性以及指示事务影响了该数据的属性,包括 SYSTEM_TIME 时间段使用的行开始列和行结束列以跟踪一行为最新版本的时间,以及事务开始标识列,该列会捕获影响行的事务的开始时间。
    SYSTEM_TIME 时间段包含一对 TIMESTAMP(12) 列,其值由数据库管理器生成。必须使用适用 GENERATED ALWAYS AS 选项将这些列定义为 NOT NULL。时间段的开始列必须是行开始列,时间段的结束列必须是行结束列。

    CREATE TABLE CONTACTS(
ID INT NOT NULL PRIMARY KEY,
NAME CHAR(15),
PHONENUM CHAR(11),
SYS_START TIMESTAMP(12) GENERATED ALWAYS AS ROW BEGIN NOT NULL,
SYS_END TIMESTAMP(12) GENERATED ALWAYS AS ROW END NOT NULL,
TRANS_START TIMESTAMP(12) GENERATED ALWAYS AS TRANSACTION START ID IMPLICITLY HIDDEN,
PERIOD SYSTEM_TIME(SYS_START,SYS_END)
)
2、创建历史记录表
    CREATE TABLE CONTACTS_HISTORY LIKE CONTACTS
3、向系统时间段临时表添加版本控制以建立与历史记录表的链接
    ALTER TABLE CONTACTS ADD VERSIONING USE HISTORY TABLE CONTACTS_HISTORY

4、查询 SYSCAT.TABLES 系统目录视图来检查表是否有临时支持
    D:>DB2 SELECT TABNAME,TEMPORALTYPE FROM SYSCAT.TABLES WHERE TABNAME='CONTACTS'
AND TABSCHEMA='ADMINISTRATOR'

TABNAME
                                                 TEMPORALTYPE
--------------------------------------------------------------------------------
------------------------------------------------ ------------
CONTACTS
                                                 S

  1 条记录已选择。
    显示TEMPORALTYPE为系统时间段临时表

插入并修改数据
1、首先向表中插入数据
    INSERT INTO CONTACTS(ID,NAME,PHONENUM) VALUES(1,'Tom','15187654321')
   隔一段时间继续插入
    INSERT INTO CONTACTS(ID,NAME,PHONENUM) VALUES(2,'John','15112345678')
   查看CONTACTS表
    D:>DB2 SELECT * FROM CONTACTS

ID          NAME            PHONENUM    SYS_START                        SYS_END

----------- --------------- ----------- -------------------------------- -------
-------------------------
          1 Tom             15187654321 2012-05-26-16.27.38.673724000000 9999-12
-30-00.00.00.000000000000
          2 John            15112345678 2012-05-26-16.32.40.204879000000 9999-12
-30-00.00.00.000000000000

  2 条记录已选择。
2、修改数据
    UPDATE CONTACTS SET PHONENUM='18612345678' WHERE ID=1

    再次查看CONTACTS表,注意SYS_START字段的变化:
     D:>DB2 SELECT * FROM CONTACTS

ID          NAME            PHONENUM    SYS_START                        SYS_END

----------- --------------- ----------- -------------------------------- -------
-------------------------
          1 Tom             18612345678 2012-05-26-16.36.06.312348000000 9999-12
-30-00.00.00.000000000000
          2 John            15112345678 2012-05-26-16.32.40.204879000000 9999-12
-30-00.00.00.000000000000

  2 条记录已选择。

此时,Tom的PHONENUM被修改为18612345678,且SYS_START列跟踪了行的变化

而此时的CONTACTS_HISTORY表:
    D:>DB2 SELECT * FROM CONTACTS_HISTORY

ID          NAME            PHONENUM    SYS_START                        SYS_END

----------- --------------- ----------- -------------------------------- -------
-------------------------
          1 Tom             15187654321 2012-05-26-16.27.38.673724000000 2012-05
-26-16.36.06.312348000000

  1 条记录已选择。

-----留意我加粗的三个时间戳的值,有所发现吗?

                                见证奇迹的时刻
  我要查看时间戳2012-05-26-16.36.06.312348000000以前(如2012-05-26-
16.35.00)的数据

   D:>DB2 SELECT ID,NAME,PHONENUM FROM CONTACTS FOR SYSTEM_TIME AS OF '2012-05-26-
16.35.00'

ID          NAME            PHONENUM
----------- --------------- -----------
          1 Tom             15187654321
          2 John            15112345678

  2 条记录已选择。


如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

X社区推广