自動啟用表的FLASHBACK ARCHIVE續之觸發器型別的選擇
在文章《自動啟用表的FLASHBACK ARCHIVE》中用的是DATABASE級別的觸發器,並且指出使用SCHEMA級別的觸發器可能會失效,也就是觸發器不會觸發。這裡就透過實驗的方式來說明。
首先我們來建立兩個實驗使用者JET1和JET2:
15:15:13 sys@audtest[hxddcx02]> CREATE USER JET1 IDENTIFIED BY JET1;
User created.
15:15:28 sys@audtest[hxddcx02]> GRANT DBA TO JET1;
Grant succeeded.
15:15:40 sys@audtest[hxddcx02]> CREATE USER JET2 IDENTIFIED BY JET2;
User created.
15:15:53 sys@audtest[hxddcx02]> GRANT DBA TO JET2;
Grant succeeded. |
我們以JET1使用者登入到資料庫,並建立一個SCHEMA觸發器:
15:15:59 sys@audtest[hxddcx02]> conn JET1/JET1 Connected. 15:19:45 jet1@audtest[hxddcx02]> CREATE OR REPLACE TRIGGER TRI_JET1 15:20:43 2 AFTER DDL ON JET1.SCHEMA 15:20:43 3 BEGIN 15:20:43 4 dbms_output.put_line('DDL Trigger on JET1.'); 15:20:43 5 END; 15:20:43 6 /
Trigger created. |
然後我們嘗試建一個TABLE:
我們可以看到觸發器已經被觸發了。我們另開一個視窗,以JET2使用者登入資料庫,並嘗試在JET1上建一個TABLE:
TABLE順利建立,但是我們可以看到觸發器並沒有觸發。為什麼會這樣呢?這是因為我們在執行CREATE TABLE JET1.TEST2語句時其實是在執行一個匿名塊(anonymous block),而匿名塊始終表現為IR unit(invoker’s rights unit),也就是說此時的觸發事件是屬於JET2的,而不是JET1,這樣的話自然就不會觸發觸發器了。為了更直觀的來理解該問題,我們可以建兩個儲存過程來說明。
首先建一個DR unit(definer's rights unit)的儲存過程:
CREATE OR REPLACE PROCEDURE CRT_TABLE ( tabname VARCHAR2 ) IS opsql VARCHAR2(200); BEGIN opsql := 'CREATE TABLE JET1.'||tabname||' (ID NUMBER, NAME VARCHAR2(30))'; EXECUTE IMMEDIATE opsql; END; / |
然後建一個IR unit的儲存過程:
CREATE OR REPLACE PROCEDURE CRT_TABLE2 ( tabname VARCHAR2 ) AUTHID CURRENT_USER IS opsql VARCHAR2(200); BEGIN opsql := 'CREATE TABLE JET1.'||tabname||' (ID NUMBER, NAME VARCHAR2(30))'; EXECUTE IMMEDIATE opsql; END; / |
JET1使用者呼叫CRT_TABLE時:
可以看到觸發器被正確觸發了。JET2使用者呼叫CRT_TABLE時:
可以看到觸發器也被觸發了,這也是正確的動作。那作為對比,我們來看看呼叫CRT_TABLE2時的情況:
JET1使用者呼叫CRT_TABLE2時:
JET2使用者呼叫CRT_TABLE2時:
這個就和之前直接執行CREATE TABLE時的情景一樣了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/13885898/viewspace-1656453/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- springboot啟動的applicationContext的型別選擇Spring BootAPPContext型別
- 【FLASHBACK】Oracle flashback data archive 介紹OracleHive
- Flashback Data Archive原理詳解Hive
- 觸發器實現表資料自動更新觸發器
- SAP RETAIL 如何確定自動補貨觸發的單據型別AI型別
- React 進階之選擇合適的元件型別React元件型別
- SAP RETAIL 如何確定自動補貨觸發的單據型別 IIAI型別
- SAP RETAIL 如何確定自動補貨觸發的單據型別 IIIAI型別
- 觸發form表單自動提交的方式有哪些?ORM
- 設計表時,如何選擇正確的資料型別資料型別
- css選擇器有哪幾種型別CSS型別
- jQuery選擇器介紹:基本選擇器、層次選擇器、過濾選擇器、表單選擇器jQuery
- 禁止oracle表的觸發器triggerOracle觸發器
- 關於css選擇器和樣式表的應用CSS
- 選擇適合的型別判斷方式型別
- 《高效能MySQL》筆記——MySQL建表資料型別的選擇MySql筆記資料型別
- jQuery選擇器之層次選擇器jQuery
- Oracle 19c 利用觸發器在資料庫啟動後自動開啟 PDBOracle觸發器資料庫
- mysql 貨幣型別 選擇MySql型別
- 如何選擇合適的SSL證書型別型別
- [20180424]開啟表空flashback on.txt
- 根據需要的圖表型別選擇echarts對應的series型別型別Echarts
- Camstar Grid中B列的值來自A列選擇後觸發查詢得到 (程式碼)
- PostgreSQLrotatetable自動清理排程-約束,觸發器SQL觸發器
- 高效能Mysql(第3版)_資料型別的選擇_整數型別MySql資料型別
- Web自動化之瀏覽器啟動Web瀏覽器
- 你的遊戲型別選擇早被設計師掌握遊戲型別
- Jquery的選擇器jQuery
- 如何開發視覺化大屏?報表自動化是最優選擇!視覺化
- Swing 自定義JTable 多選框 自動選擇的錯誤
- 002---選擇器(標籤選擇器、類選擇器、id選擇器、偽類選擇器、萬用字元選擇器)字元
- js選擇物件和jq選擇物件的區別JS物件
- 開啟網頁 自動提示選擇qq實現方式整理網頁
- 如何選擇合適的自動化測試工具?
- 初學jQuery(表單選擇器)jQuery
- Java NIO之Selector(選擇器)Java
- 相鄰兄弟選擇器、後代選擇器和子選擇器三者有什麼區別?
- 前端筆記之jQuery(上)載入函式的區別&物件&操作HTML/CSS&動畫&選擇器前端筆記jQuery函式物件HTMLCSS動畫
- dom選擇方法的區別