Oracle11gr2觸發器依賴判斷增強(一)

yangtingkun發表於2009-10-09

11.1中,Oracle做到了物件的列級依賴,但是觸發器並沒有做到這一點。在11.2的新特性文件中提到了觸發器也具備了列級依賴的能力。

Oracle11新特性——線上操作功能增強(三):http://yangtingkun.itpub.net/post/468/401641

 

 

11.1.0.6上進行的測試:

SQL> create table t (id number);

表已建立。

SQL> create trigger t              
  2  before update of id on t
  3  for each row
  4  begin
  5  :new.id := 1;
  6  end;
  7  /

觸發器已建立

SQL> col object_name format a30
SQL> select object_name, object_type, status
  2  from user_objects
  3  where object_name = 'T';

OBJECT_NAME                    OBJECT_TYPE                            STATUS
------------------------------ -------------------------------------- --------------
T                              TABLE                                  VALID
T                              TRIGGER                                VALID

SQL> alter table t add name varchar2(30);

表已更改。

SQL> select object_name, object_type, status
  2  from user_objects
  3  where object_name = 'T';

OBJECT_NAME                    OBJECT_TYPE                            STATUS
------------------------------ -------------------------------------- --------------
T                              TABLE                                  VALID
T                              TRIGGER                                INVALID

SQL> select * from v$version;

BANNER
-----------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - 64bit Production
PL/SQL Release 11.1.0.6.0 - Production
CORE    11.1.0.6.0      Production
TNS for Solaris: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production

可以看到雖然觸發器明確指明瞭依賴TID列,但是如果T表新增了其他列,仍然會導致觸發器被置於INVALID狀態。

而在11.2中:

SQL> create table t(id number);

表已建立。

SQL> create trigger t
  2  before update of id on t
  3  for each row
  4  begin
  5  :new.id := 1;
  6  end;
  7  /

觸發器已建立

SQL> select object_name, object_type, status
  2  from user_objects
  3  where object_name = 'T';

OBJECT_NAME                    OBJECT_TYPE         STATUS
------------------------------ ------------------- -------
T                              TRIGGER             VALID
T                              TABLE               VALID

SQL> alter table t add name varchar2(30);

表已更改。

SQL> select object_name, object_type, status
  2  from user_objects
  3  where object_name = 'T';

OBJECT_NAME                    OBJECT_TYPE         STATUS
------------------------------ ------------------- -------
T                              TRIGGER             VALID
T                              TABLE               VALID

SQL> select * from v$version;

BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
PL/SQL Release 11.2.0.1.0 - Production
CORE    11.2.0.1.0      Production
TNS for Linux: Version 11.2.0.1.0 - Production
NLSRTL Version 11.2.0.1.0 - Production

顯然列級依賴的問題已經實現。

 

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-616191/,如需轉載,請註明出處,否則將追究法律責任。

相關文章