關於觸發器建立的陷阱

2021-06-28 12:12:06 字數 1028 閱讀 3676

oracle觸發器的建立和儲存過程、函式、包等的建立有點區別,應當注意.

陷阱一:

當前schema與觸發器擁有者不一致

例如:當前登入的schema為r5_t150,然後執行下面的建立觸發器:

create or replace trigger "r5_t135".tri_forbidden_01

before update or delete of goodscode on t_goods

begin

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_goods

begin

end tri_forbidden_01;

alter trigger tri_forbidden_01 enable;

這樣建立的觸發器將顯示為編譯無效的狀態,檢視其原始碼,發現最後一句alter trigger tri_forbidden_01 enable;也會在觸發器的原始碼之中.

最後:特別注意不要建立類似這樣命名的觸發器"tri_aabb","tri_test",因為有些工具刪除或編譯這樣的觸發器時會報錯,到時只能用命令來操作,相當麻煩.

建立觸發器

視覺化資料庫工具 對於 microsoft sql server 資料庫,可以在 transact sql 中編寫觸發器,而對於 oracle 資料庫,則可以在 pl sql 中進行編寫。通過指定下列內容建立觸發器 建立觸發器 在 伺服器資源管理器 中,展開 表 資料夾。右擊要在其上建立觸發器的表名...

建立觸發器

create trigger trigger insert test1 on test2 after insert asbegin set nocount on added to prevent extra result sets from interfering with select state...

建立觸發器

create or replace trigger tg student after insert or update or delete on student foreach row declare 定義變數 begin 記錄日誌的程式 操作型別 case when inserting then ...