在oracle中使用Trigger
生活随笔
收集整理的這篇文章主要介紹了
在oracle中使用Trigger
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
1、初始目標(biāo)
在對表h1插入一條數(shù)據(jù)時,同時插入一條重復(fù)的數(shù)據(jù)(只有主鍵不同)
2、在PL/SQL里New一個Trigger或者手動敲入代碼
先說明一下,表h1包括4列ID、C1、C2、C3
create or replace trigger Trigger_Testafter insert on h1for each row declare--variables begininsert into h1 values(:new.C1, :new.C2, :new.C3, :new.ID); end Trigger_Test;3、F8編譯通過,新建一個窗口執(zhí)行insert窗口,測試trigger是否有效,用了一個名為sequence_test的序列:
insert into h1 values('aa','bb','cc',sequence_test.nextval);報錯:表h1發(fā)生了變化,觸發(fā)器/函數(shù)不能讀。
4、網(wǎng)上搜的說法是“觸發(fā)器不能修改觸發(fā)表的數(shù)據(jù),除非使用自治事務(wù)”,OK那就用自治事務(wù):
declare--variables //改為: declarepragma autonomous_transaction;再試報錯:等待資源時檢測到死鎖。仔細一查,哦原來是目標(biāo)有問題,Insert連著Insert,無限循環(huán),不是資源死鎖就是內(nèi)存不足或者棧溢出。
5、目標(biāo)更新為:在對表h1插入一條數(shù)據(jù)時,同時插入一條相同的數(shù)據(jù)到歷史表里,把trigger里的insert修改為:
insert into h1_history values(:new.C1, :new.C2, :new.C3, :new.ID);再跑又報錯:檢測到活動的自治事務(wù)處理,已經(jīng)回退。
6、網(wǎng)上接著搜,說是有事務(wù)沒提交。其實這是之前目標(biāo)設(shè)定有問題,觸發(fā)器一般不會修改觸發(fā)表,用了自治事務(wù),就要commit;如果是插入歷史表,可以都不加。
declarepragma autonomous_transaction;commit;delete from h1 where ID = 1;commit;//如果不操作觸發(fā)表,則可以去掉自治事務(wù)的這一串聲明 declareinsert into h1_history values(:new.C1, :new.C2, :new.C3, :new.ID);7、小結(jié)
轉(zhuǎn)載于:https://www.cnblogs.com/AlexanderYao/p/4514377.html
總結(jié)
以上是生活随笔為你收集整理的在oracle中使用Trigger的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 怎么给广发银行信用卡挂失补办?挂失补办要
- 下一篇: [转]wireshark 实用过滤表达式