關於觸發器建立的陷阱,觸發器建立陷阱
Oracle觸發器的建立和預存程序、函數、包等的建立有點區別,應當注意.
陷阱一:
當前schema與觸發器擁有者不一致
例如:
當前登入的schema為R5_T150,然後執行下面的建立觸發器:
create or replace trigger "R5_T135".TRI_forbidden_01 before update or delete of GOODSCODE on t_goodsbegin RAISE_APPLICATION_ERROR(-20002, 'forbidden operations!');end TRI_forbidden_01;
如果是預存程序、函數,這樣建立是沒有問題的,但觸發器不一樣,為什嗎?
注意觸發器是可以跨schema的(系統級觸發器).所以上面的代碼最終建立的觸發器應會是屬於R5_T135(它是DBA角色)這個schema,但所觸發的表卻是R5_T150的.
這樣就會在PL/SQL DEV工具裡出現一個奇怪的現象,在當前SCHEMA下,查看錶上的觸發器會發現有"R5_T135".TRI_FORBIDDEN_01,但去查看當前SCHEMA所有的觸發器卻找不到它.
陷阱二:
如果我們使用PL/SQL DEV中的sql Window來建立觸發器(或將下面的代碼使用sqlplus指令碼來建立):
create or replace trigger TRI_forbidden_01 before update or delete of GOODSCODE on t_goodsbegin RAISE_APPLICATION_ERROR(-20002, 'forbidden operations!');end TRI_forbidden_01;alter trigger TRI_forbidden_01 enable;
這樣建立的觸發器將顯示為編譯無效的狀態,查看其源碼,發現最後一句alter trigger TRI_forbidden_01 enable;也會在觸發器的源碼之中.
最後:特別注意不要建立類似這樣命名的觸發器"TRI_aaBB","TrI_Test",因為有些工具刪除或編譯這樣的觸發器時會報錯,到時只能用命令來操作,相當麻煩.