ITPub博客

首页 > Linux操作系统 > Linux操作系统 > Oracle11gr2触发器新增版本升级功能(一)

Oracle11gr2触发器新增版本升级功能(一)

原创 Linux操作系统 作者:yangtingkun 时间:2010-01-06 23:56:12 0 删除 编辑

Oracle11gr2增加了版本升级触发器功能。

这篇简单描述CROSSEDITION功能。

 

11.2不但增加了版本的功能,而且还提供了不停机的版本升级功能。为了保证在升级版本的过程中,用户仍然可以访问数据,Oracle提供了CROSSEDITION触发器来处理版本升级或降级过程中的数据问题。

简单的说,CROSSEDITION触发器可以其他的版本中生效,使得登陆到其他版本的会话执行的DML可以正确的将数据应用到当前版本。如果是升级版本,使用FORWARD CROSSEDITION触发器,这个触发器在当前版本的父版本中触发。如果是降级版本,使用REVERSE CROSSEDITION触发器,这个触发器在当前版本和子版本中触发。

由于版本升级涉及的内容比较多,这里只给出一个最简单的升级版本使用CROSSEDITION对应的例子:

SQL> CREATE TABLE T_PERSON (ID NUMBER PRIMARY KEY,
  2  FIRST_NAME VARCHAR2(30),
  3  LAST_NAME VARCHAR2(30));

表已创建。

SQL> INSERT INTO T_PERSON
  2  SELECT ROWNUM, OBJECT_NAME, OBJECT_TYPE
  3  FROM USER_OBJECTS;

已创建15行。

SQL> COMMIT;

提交完成。

SQL> CREATE EDITION E_1;

版本已创建。

SQL> ALTER SESSION SET EDITION = E_1;

会话已更改。

SQL> ALTER TABLE T_PERSON ADD FULL_NAME VARCHAR2(60);

表已更改。

SQL> CREATE TRIGGER T_CROSSEDITION_PERSON
  2  BEFORE INSERT OR UPDATE ON T_PERSON
  3  FOR EACH ROW
  4  CROSSEDITION
  5  BEGIN
  6     :NEW.FULL_NAME := :NEW.FIRST_NAME || :NEW.LAST_NAME;
  7  END;
  8  /

触发器已创建

SQL> ALTER SESSION SET EDITION = ORA$BASE;

会话已更改。

SQL> INSERT INTO T_PERSON                          
  2  (ID, FIRST_NAME, LAST_NAME)
  3  VALUES (16, 'T_CROSSEDITION_PERSON', 'TRIGGER');

已创建 1 行。

SQL> SELECT * FROM T_PERSON;

        ID FIRST_NAME            LAST_NAME       FULL_NAME
---------- --------------------- --------------- -----------------------------------
         1 T                     VIEW
         2 T_TABLE               TABLE
         3 T_TABLE               TRIGGER
         4 T_MYTEST              TYPE
         5 FORCE                 TYPE
         6 T_TYPE                TYPE
         7 ABC                   TABLE
         8 S_1                   SYNONYM
         9 T1                    TABLE
        10 S_MY_EDITION          SYNONYM
        11 T_PERSON              TABLE
        12 SYS_C0011140          INDEX
        13 T_LOG                 TABLE
        14 T                     TRIGGER
        15 TEST                  DATABASE LINK
        16 T_CROSSEDITION_PERSON TRIGGER         T_CROSSEDITION_PERSONTRIGGER

已选择16行。

SQL> UPDATE T_PERSON       
  2  SET FIRST_NAME = 'TEST.US.ORACLE.COM'
  3  WHERE ID = 15;

已更新 1 行。

SQL> SELECT * FROM T_PERSON;

        ID FIRST_NAME            LAST_NAME       FULL_NAME
---------- --------------------- --------------- -----------------------------------
         1 T                     VIEW
         2 T_TABLE               TABLE
         3 T_TABLE               TRIGGER
         4 T_MYTEST              TYPE
         5 FORCE                 TYPE
         6 T_TYPE                TYPE
         7 ABC                   TABLE
         8 S_1                   SYNONYM
         9 T1                    TABLE
        10 S_MY_EDITION          SYNONYM
        11 T_PERSON              TABLE
        12 SYS_C0011140          INDEX
        13 T_LOG                 TABLE
        14 T                     TRIGGER
        15 TEST.US.ORACLE.COM    DATABASE LINK   TEST.US.ORACLE.COMDATABASE LINK
        16 T_CROSSEDITION_PERSON TRIGGER         T_CROSSEDITION_PERSONTRIGGER

已选择16行。

SQL> COMMIT;

提交完成。

SQL> ALTER SESSION SET EDITION = E_1;

会话已更改。

SQL> INSERT INTO T_PERSON
  2  (ID, FIRST_NAME, LAST_NAME)
  3  VALUES (17, 'TEST', 'TEST');

已创建 1 行。

SQL> SELECT * FROM T_PERSON;

        ID FIRST_NAME            LAST_NAME       FULL_NAME
---------- --------------------- --------------- -----------------------------------
         1 T                     VIEW
         2 T_TABLE               TABLE
         3 T_TABLE               TRIGGER
         4 T_MYTEST              TYPE
         5 FORCE                 TYPE
         6 T_TYPE                TYPE
         7 ABC                   TABLE
         8 S_1                   SYNONYM
         9 T1                    TABLE
        10 S_MY_EDITION          SYNONYM
        11 T_PERSON              TABLE
        12 SYS_C0011140          INDEX
        13 T_LOG                 TABLE
        14 T                     TRIGGER
        15 TEST.US.ORACLE.COM    DATABASE LINK   TEST.US.ORACLE.COMDATABASE LINK
        16 T_CROSSEDITION_PERSON TRIGGER         T_CROSSEDITION_PERSONTRIGGER
        17 TEST                  TEST

已选择17行。

在这个例子中,在建立了新版本后,还需要部署新版本对应的过程、视图,最终可能还要处理父版本的数据,使之转化为新版本的格式。在整个的过程中,新版本和旧版本都是可用的,因此存在同时访问两个版本的情况,通过建立CROSSEDITION触发器,将访问父版本时产生的数据自动转化为新版本的格式,从而避免了版本升级到来的停机时间。

当新版本升级完成,旧版本数据全部转化后,将数据库的默认版本设置为新版本,则升级工作完成,CROSSEDITION触发器的历史使命也最终完成。

 

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/4227/viewspace-624546/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
暂无介绍

注册时间:2007-12-29

  • 博文量
    1964
  • 访问量
    11076556