在oracle中使用Trigger
生活随笔
收集整理的這篇文章主要介紹了
在oracle中使用Trigger
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1、初始目標(biāo)
在對(duì)表h1插入一條數(shù)據(jù)時(shí),同時(shí)插入一條重復(fù)的數(shù)據(jù)(只有主鍵不同)
2、在PL/SQL里New一個(gè)Trigger或者手動(dòng)敲入代碼
先說(shuō)明一下,表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編譯通過(guò),新建一個(gè)窗口執(zhí)行insert窗口,測(cè)試trigger是否有效,用了一個(gè)名為sequence_test的序列:
insert into h1 values('aa','bb','cc',sequence_test.nextval);報(bào)錯(cuò):表h1發(fā)生了變化,觸發(fā)器/函數(shù)不能讀。
4、網(wǎng)上搜的說(shuō)法是“觸發(fā)器不能修改觸發(fā)表的數(shù)據(jù),除非使用自治事務(wù)”,OK那就用自治事務(wù):
declare--variables //改為: declarepragma autonomous_transaction;再試報(bào)錯(cuò):等待資源時(shí)檢測(cè)到死鎖。仔細(xì)一查,哦原來(lái)是目標(biāo)有問(wèn)題,Insert連著Insert,無(wú)限循環(huán),不是資源死鎖就是內(nèi)存不足或者棧溢出。
5、目標(biāo)更新為:在對(duì)表h1插入一條數(shù)據(jù)時(shí),同時(shí)插入一條相同的數(shù)據(jù)到歷史表里,把trigger里的insert修改為:
insert into h1_history values(:new.C1, :new.C2, :new.C3, :new.ID);再跑又報(bào)錯(cuò):檢測(cè)到活動(dòng)的自治事務(wù)處理,已經(jīng)回退。
6、網(wǎng)上接著搜,說(shuō)是有事務(wù)沒(méi)提交。其實(shí)這是之前目標(biāo)設(shè)定有問(wèn)題,觸發(fā)器一般不會(huì)修改觸發(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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 怎么给广发银行信用卡挂失补办?挂失补办要
- 下一篇: [转]wireshark 实用过滤表达式