系統觸發器的應用順序(一)
在寫一個AFTER SUSPEND觸發器的時候碰到了一個很有趣的現象。
首先描述一下系統級觸發器的觸發順序。
如果使用者級和系統級的觸發器全部存在的話,那麼Oracle是否會觸發兩個觸發器,還是隻觸發其中的一個呢,還是做一個簡單的例子來說明這個問題。
仍然使用AFTER SUSPEND觸發器的例子,不過將觸發器的內容變得簡單一點。
SQL> CONN YANGTK/YANGTK@YTK102
已連線。
SQL> SET PAGES 100 LINES 120
SQL> CREATE TABLE T_TRIGGER (INFO VARCHAR2(20));
表已建立。
SQL> CREATE OR REPLACE TRIGGER TRI_SCHEMA_SUSPEND
2 AFTER SUSPEND ON SCHEMA
3 DECLARE
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO T_TRIGGER VALUES ('SCHEMA TRIGGER');
7 COMMIT;
8 END;
9 /
觸發器已建立
SQL> SELECT SUM(BYTES)/1024/1024
2 FROM DBA_FREE_SPACE
3 WHERE TABLESPACE_NAME = 'YANGTK';
SUM(BYTES)/1024/1024
--------------------
214.375
SQL> ALTER SESSION ENABLE RESUMABLE TIMEOUT 300;
會話已更改。
SQL> CREATE TABLE T_BIG (ID NUMBER)
2 TABLESPACE YANGTK
3 STORAGE (INITIAL 250M);
CREATE TABLE T_BIG (ID NUMBER)
*
第 1 行出現錯誤:
ORA-30032: 掛起的 (可恢復) 語句已超時
ORA-01659: 無法分配超出 27 的 MINEXTENTS (在表空間 YANGTK 中)
SQL> SELECT * FROM T_TRIGGER;
INFO
--------------------
SCHEMA TRIGGER
可以看到,SCHEMA級的觸發器可以生效,下面看看DATABASE級的觸發器:
SQL> DROP TRIGGER TRI_SCHEMA_SUSPEND;
觸發器已刪除。
SQL> CONN / AS SYSDBA
已連線。
SQL> CREATE OR REPLACE TRIGGER TRI_DATABASE_SUSPEND
2 AFTER SUSPEND ON DATABASE
3 DECLARE
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO YANGTK.T_TRIGGER VALUES ('DATABASE TRIGGER');
7 COMMIT;
8 END;
9 /
觸發器已建立
SQL> CONN YANGTK/YANGTK@YTK102
已連線。
SQL> ALTER SESSION ENABLE RESUMABLE TIMEOUT 300;
會話已更改。
SQL> CREATE TABLE T_BIG (ID NUMBER)
2 TABLESPACE YANGTK
3 STORAGE (INITIAL 250M);
CREATE TABLE T_BIG (ID NUMBER)
*
第 1 行出現錯誤:
ORA-30032: 掛起的 (可恢復) 語句已超時
ORA-01659: 無法分配超出 27 的 MINEXTENTS (在表空間 YANGTK 中)
SQL> SELECT * FROM T_TRIGGER;
INFO
--------------------
DATABASE TRIGGER
SCHEMA TRIGGER
資料庫級的觸發器也是可以正常工作的,下面看看如果同時建立兩個觸發器,當觸發事件發生後,將會發生什麼情況:
SQL> TRUNCATE TABLE T_TRIGGER;
表被截斷。
SQL> CREATE OR REPLACE TRIGGER TRI_SCHEMA_SUSPEND
2 AFTER SUSPEND ON SCHEMA
3 DECLARE
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO T_TRIGGER VALUES ('SCHEMA TRIGGER');
7 COMMIT;
8 END;
9 /
觸發器已建立
SQL> CONN YANGTK/YANGTK@YTK102
已連線。
SQL> ALTER SESSION ENABLE RESUMABLE TIMEOUT 300;
會話已更改。
SQL> CREATE TABLE T_BIG (ID NUMBER)
2 TABLESPACE YANGTK
3 STORAGE (INITIAL 250M);
CREATE TABLE T_BIG (ID NUMBER)
*
第 1 行出現錯誤:
ORA-30032: 掛起的 (可恢復) 語句已超時
ORA-01659: 無法分配超出 27 的 MINEXTENTS (在表空間 YANGTK 中)
SQL> SELECT * FROM T_TRIGGER;
INFO
--------------------
SCHEMA TRIGGER
DATABASE TRIGGER
測試結果說明資料庫級觸發器和SCHEMA級觸發器沒有優先順序的關係,只要滿足觸發條件,都會觸發。
下面測試不同使用者下的同名觸發器的情況:
SQL> DROP TRIGGER TRI_SCHEMA_SUSPEND;
觸發器已刪除。
SQL> CONN / AS SYSDBA
已連線。
SQL> DROP TRIGGER TRI_DATABASE_SUSPEND;
觸發器已刪除。
SQL> CREATE OR REPLACE TRIGGER TRI_SUSPEND
2 AFTER SUSPEND ON DATABASE
3 DECLARE
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO YANGTK.T_TRIGGER VALUES ('SYS TRIGGER');
7 COMMIT;
8 END;
9 /
觸發器已建立
SQL> CONN YANGTK/YANGTK@YTK102
已連線。
SQL> CREATE OR REPLACE TRIGGER TRI_SUSPEND
2 AFTER SUSPEND ON DATABASE
3 DECLARE
4 PRAGMA AUTONOMOUS_TRANSACTION;
5 BEGIN
6 INSERT INTO T_TRIGGER VALUES ('YANGTK TRIGGER');
7 COMMIT;
8 END;
9 /
觸發器已建立
SQL> TRUNCATE TABLE T_TRIGGER;
表被截斷。
SQL> ALTER SESSION ENABLE RESUMABLE TIMEOUT 300;
會話已更改。
SQL> CREATE TABLE T_BIG (ID NUMBER)
2 TABLESPACE YANGTK
3 STORAGE (INITIAL 250M);
CREATE TABLE T_BIG (ID NUMBER)
*
第 1 行出現錯誤:
ORA-30032: 掛起的 (可恢復) 語句已超時
ORA-01659: 無法分配超出 27 的 MINEXTENTS (在表空間 YANGTK 中)
SQL> SELECT * FROM T_TRIGGER;
INFO
--------------------
SYS TRIGGER
YANGTK TRIGGER
只要滿足觸發條件,無論觸發器在哪個SCHEMA下,都會被觸發。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/4227/viewspace-608106/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 聊一下Button事件、命令、行為的觸發順序事件
- 順序表應用5:有序順序表歸併
- 順序表應用6:有序順序表查詢
- 51微控制器程式框架之帶順序的組合按鍵觸發框架
- 雲伺服器修改Linux系統核心的引導順序伺服器Linux
- H5中video的事件的觸發順序是怎樣的?H5IDE事件
- CentOS 7.0 系統更改核心啟動順序CentOS
- python描述器的訪問順序Python
- Android學習 —— 測試init.rc中的條件觸發的處理順序Android
- 雲伺服器CentOS 6.X 系統更改核心啟動順序伺服器CentOS
- 實驗二:順序表的基本操作實現及其應用
- CSS 選擇器的優先順序CSS
- 測試用例的優先順序
- Windows 應用開發的系統要求Windows
- 開發Android系統應用Android
- docker-compose下的java應用啟動順序兩部曲之一:問題分析DockerJava
- 佇列順序性引發的思考佇列
- 應用系統整合方案(一)
- 【效能測試策略】系統調優由易到難的順序
- 聊聊如何讓springboot攔截器的執行順序按我們想要的順序執行Spring Boot
- css 選擇器優先順序CSS
- OGG DDL觸發器引發的故障系列(一)觸發器
- 感測器,硬體,系統,驅動,應用軟體的發展
- [轉]androidstudio更改優先載入系統包framework.jar的順序AndroidFrameworkJAR
- Linux系統常見的日誌檔案及優先順序別!Linux
- 面向大規模佇列,百萬併發的多優先順序消費系統設計佇列
- python運算子及優先順序順序Python
- 一份python實用”技巧“清單(按字母順序)Python
- 觸發器的一些新認知觸發器
- win10系統怎麼調整輸入法順序Win10
- macos_macpath系統路徑檔案載入順序_201216Mac
- 順序表應用3:元素位置互換之移位演算法演算法
- 順序表應用7:最大子段和之分治遞迴法遞迴
- 記一個TS 列舉順序的坑
- 順序表
- Linux排程器:程序優先順序Linux
- 加推時序系統RTS實現原理及應用簡介
- ERP系統開發 ERP系統詳解及應用
- 第2章 順序表及其順序儲存