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触发器的历史使命也最终完成。