Oracle11gr2觸發器新增版本升級功能(一)

yangtingkun發表於2010-01-06

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部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-624546/,如需轉載,請註明出處,否則將追究法律責任。

相關文章