Oracle11g觸發器重用OBJECT_ID
在11g以前,重用OBJECT_ID只是對過程、函式、包和物件而言,而對於觸發器是不會重用OBJECT_ID的,從11g開始,Oracle針對觸發器也可以重用OBJECT_ID了。
OBJECT_ID的重用:http://yangtingkun.itpub.net/post/468/457962
OBJECT_ID的重用(二):http://yangtingkun.itpub.net/post/468/458030
前一段時間在介紹Oracle PL/SQL新特性的時候,提到了觸發器的新功能,可以指定觸發器的觸發順序。為了說明這個問題,舉了一個例子: http://yangtingkun.itpub.net/post/468/398314
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));
表已建立。
SQL> CREATE OR REPLACE TRIGGER TRI_T_1 AFTER INSERT ON T
2 FOR EACH ROW
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(1);
5 END;
6 /
觸發器已建立
SQL> CREATE OR REPLACE TRIGGER TRI_T_2 AFTER INSERT ON T
2 FOR EACH ROW
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(2);
5 END;
6 /
觸發器已建立
SQL> CREATE OR REPLACE TRIGGER TRI_T_3 AFTER INSERT ON T
2 FOR EACH ROW
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(3);
5 END;
6 /
觸發器已建立
SQL> SET SERVEROUT ON
SQL> INSERT INTO T VALUES (1, 'A');
3
2
1
已建立 1 行。
SQL> DROP TRIGGER TRI_T_2;
觸發器已刪除。
SQL> CREATE OR REPLACE TRIGGER TRI_T_2 AFTER INSERT ON T
2 FOR EACH ROW
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(2);
5 END;
6 /
觸發器已建立
SQL> INSERT INTO T VALUES (2, 'B');
2
3
1
已建立 1 行。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS
2 WHERE OBJECT_NAME LIKE 'TRI_T__';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
55637 TRI_T_1
55640 TRI_T_2
55639 TRI_T_3
這個例子是為了說明相同型別的觸發器的觸發順序於觸發器的OBJECT_ID順序有關。但是這個測試只是在11g之前版本有有效,因為11g以前的觸發器不會重用OBJECT_ID,如果在11g中,這個測試就會得到不同的結果:
SQL> CONN YANGTK/yangtk@ORA11G
已連線。
SQL> SELECT * FROM V$VERSION;
BANNER
--------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.1.0.6.0 - Production
PL/SQL Release 11.1.0.6.0 - Production
CORE 11.1.0.6.0 Production
TNS for Linux: Version 11.1.0.6.0 - Production
NLSRTL Version 11.1.0.6.0 - Production
SQL> CREATE TABLE T (ID NUMBER, NAME VARCHAR2(30));
表已建立。
SQL> CREATE OR REPLACE TRIGGER TRI_T_1 AFTER INSERT ON T
2 FOR EACH ROW
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(1);
5 END;
6 /
觸發器已建立
SQL> CREATE OR REPLACE TRIGGER TRI_T_2 AFTER INSERT ON T
2 FOR EACH ROW
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(2);
5 END;
6 /
觸發器已建立
SQL> CREATE OR REPLACE TRIGGER TRI_T_3 AFTER INSERT ON T
2 FOR EACH ROW
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(3);
5 END;
6 /
觸發器已建立
SQL> SET SERVEROUT ON
SQL> INSERT INTO T VALUES (1, 'A');
3
2
1
已建立 1 行。
SQL> DROP TRIGGER TRI_T_2;
觸發器已刪除。
SQL> CREATE OR REPLACE TRIGGER TRI_T_2 AFTER INSERT ON T
2 FOR EACH ROW
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(2);
5 END;
6 /
觸發器已建立
SQL> INSERT INTO T VALUES (2, 'B');
3
2
1
已建立 1 行。
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS
2 WHERE OBJECT_NAME LIKE 'TRI_T__';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
72619 TRI_T_1
72620 TRI_T_2
72621 TRI_T_3
導致11g和以前版本測試結果不同的原因就是11g對於觸發器也開始重用OBJECT_ID了。
如果想在11g中得到和以前版本一樣的結果,需要在刪除和重建之間重啟資料庫:
SQL> DROP TRIGGER TRI_T_2;
觸發器已刪除。
SQL> CONN SYS/test@ORA11G AS SYSDBA
已連線。
SQL> SHUTDOWN IMMEDIATE
資料庫已經關閉。
已經解除安裝資料庫。
ORACLE 例程已經關閉。
SQL> STARTUP
ORACLE 例程已經啟動。
Total System Global Area 129732608 bytes
Fixed Size 1298360 bytes
Variable Size 109051976 bytes
Database Buffers 16777216 bytes
Redo Buffers 2605056 bytes
資料庫裝載完畢。
資料庫已經開啟。
SQL> CONN YANGTK/yangtk@ORA11G
已連線。
SQL> CREATE OR REPLACE TRIGGER TRI_T_2 AFTER INSERT ON T
2 FOR EACH ROW
3 BEGIN
4 DBMS_OUTPUT.PUT_LINE(2);
5 END;
6 /
觸發器已建立
SQL> SET SERVEROUT ON
SQL> INSERT INTO T VALUES (3, 'C');
2
3
1
已建立 1 行。
SQL> COL OBJECT_NAME FORMAT A30
SQL> SELECT OBJECT_ID, OBJECT_NAME FROM USER_OBJECTS
2 WHERE OBJECT_NAME LIKE 'TRI_T__';
OBJECT_ID OBJECT_NAME
---------- ------------------------------
72619 TRI_T_1
72628 TRI_T_2
72621 TRI_T_3
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-230951/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- D觸發器觸發器
- mysql觸發器MySql觸發器
- MySql-觸發器MySql觸發器
- sqlserver 列觸發器SQLServer觸發器
- 除錯觸發器除錯觸發器
- 建立MySQL觸發器MySql觸發器
- SqlServer-觸發器SQLServer觸發器
- logon觸發器for dbaGo觸發器
- MySQL使用觸發器MySql觸發器
- 語句觸發器觸發器
- 瞭解SQL Server觸發器及觸發器中的事務AWSQLServer觸發器
- 行為和觸發器觸發器
- MySQL觸發器介紹MySql觸發器
- sql-server觸發器SQLServer觸發器
- 觸發器 REFERENCING OLD AS OLD觸發器
- Oracle開發基礎-觸發器Oracle觸發器
- mvvm模式 事件觸發器[wpf]MVVM模式事件觸發器
- MySQL入門-- TRIGGER(觸發器)MySql觸發器
- SQL Server:觸發器詳解SQLServer觸發器
- iOS開發-UITableView的重用機制iOSUIView
- SQL Server 觸發器詳情HOPPSQLServer觸發器
- 禁止oracle表的觸發器triggerOracle觸發器
- MSMQ 觸發器 安裝失敗MQ觸發器
- MySQL觸發器的使用規則MySql觸發器
- SqlServer觸發器的建立與使用SQLServer觸發器
- SQL觸發器例項講解SQL觸發器
- 暫存器,觸發器,三極體小結觸發器
- 如何重用瀏覽器tab開啟頁面瀏覽器
- OGG DDL觸發器引發的故障系列(一)觸發器
- 雲開發 CloudBase 已上線觸發器能力Cloud觸發器
- 25. 使用MySQL之使用觸發器MySql觸發器
- 資料庫檢視,索引,觸發器資料庫索引觸發器
- 資料庫的觸發器的使用資料庫觸發器
- 數位電路中的觸發器觸發器
- [MySQL光速入門]026 觸發器 trigger!!!MySql觸發器
- MySQL全面瓦解17:觸發器相關MySql觸發器
- 淺入淺出SQL Server 觸發器SQLServer觸發器
- oracle儲存過程和觸發器Oracle儲存過程觸發器
- OpenHarmony定義元件重用樣式:@Styles裝飾器元件