自動啟用表的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 database如何選擇需要應用的flashback logDatabase
- 透過觸發器複製包含LONG型別的表觸發器型別
- 觸發器實現表資料自動更新觸發器
- SAP RETAIL 如何確定自動補貨觸發的單據型別AI型別
- React 進階之選擇合適的元件型別React元件型別
- 商品新增-選擇商品型別自動載入商品屬性型別
- SAP RETAIL 如何確定自動補貨觸發的單據型別 IIIAI型別
- SAP RETAIL 如何確定自動補貨觸發的單據型別 IIAI型別
- JS直譯器之自動型別轉換:[]==![]JS型別
- 設計表時,如何選擇正確的資料型別資料型別
- css選擇器有哪幾種型別CSS型別
- 選擇合適的資料型別資料型別
- jQuery選擇器介紹:基本選擇器、層次選擇器、過濾選擇器、表單選擇器jQuery
- 滑鼠觸動能自動彈出的選單
- 【FLASHBACK】Oracle flashback data archive 介紹OracleHive
- jQuery選擇器之層次選擇器jQuery
- Oracle觸發器觸發級別Oracle觸發器
- Oracle Flashback Data ArchiveOracleHive
- Flashback Data Archive RequirementsHiveUIREM
- 關於css選擇器和樣式表的應用CSS
- 選擇適合的型別判斷方式型別
- dorado中的creationType選擇型別型別
- 《高效能MySQL》筆記——MySQL建表資料型別的選擇MySql筆記資料型別
- iOS開發之UITableView聯動實現城市選擇器iOSUIView
- Oracle 19c 利用觸發器在資料庫啟動後自動開啟 PDBOracle觸發器資料庫
- jQuery選擇器——表單元素過濾選擇器jQuery
- input和:input選擇器的區別
- mysql 貨幣型別 選擇MySql型別
- 31種選擇器的應用
- 如何選擇合適的SSL證書型別型別
- 關於Oracle 中驅動表的選擇Oracle
- PostgreSQLrotatetable自動清理排程-約束,觸發器SQL觸發器
- oracle 觸發器-表同步Oracle觸發器
- Oracle之觸發器Oracle觸發器
- 你的遊戲型別選擇早被設計師掌握遊戲型別
- 禁止oracle表的觸發器triggerOracle觸發器
- Web自動化之瀏覽器啟動Web瀏覽器