關於觸發器建立的陷阱,觸發器建立陷阱

來源:互聯網
上載者:User

關於觸發器建立的陷阱,觸發器建立陷阱

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",因為有些工具刪除或編譯這樣的觸發器時會報錯,到時只能用命令來操作,相當麻煩.

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.