Oracle行級(jí)觸發(fā)器的使用操作

oracle行級(jí)觸發(fā)器的使用操作

 

oracle行級(jí)觸發(fā)器的使用

1、創(chuàng)建觸發(fā)器并使用dblink在插入時(shí)進(jìn)行數(shù)據(jù)同步

異庫異表同步

create or replace trigger triggername --觸發(fā)器名稱
after insert on tablename  --操作的表
for each row ——行級(jí)觸發(fā)器
declare --這里是關(guān)鍵的地方,在變量申明的地方,指定自定義事務(wù)處理。
pragma autonomous_transaction;
begin
insert into "test_user"@mysqltwo ("userid","username") values (:new.userid,:new.username);
--這里需要顯示提交事務(wù)
commit;
end;

同庫異表同步

create or replace trigger triggername --觸發(fā)器名稱
after insert on tablename  --操作的表
for each row ——行級(jí)觸發(fā)器
begin
insert into test_user (userid,username) values (:new.userid,:new.username);
--這里不需要顯示提交事務(wù)
--commit;
end;

oracle 行級(jí)觸發(fā)器trigger中有:new,:old兩個(gè)特殊變量,當(dāng)觸發(fā)器為行級(jí)觸發(fā)器的時(shí)候,觸發(fā)器就會(huì)提供new和old兩個(gè)保存臨時(shí)行數(shù)據(jù)的特殊變量,我們可以從倆個(gè)特殊的變量中取出數(shù)據(jù)執(zhí)行擴(kuò)張表的dml操作

 

擴(kuò)展

after 與 before驅(qū)別在兩種情況下可體現(xiàn)差別
第一種情況:dml語句執(zhí)行失敗時(shí),如觸發(fā)器使用before,則不會(huì)考慮語句是否執(zhí)行成功,皆觸發(fā);如使用after,因?yàn)閳?bào)錯(cuò)不會(huì)繼續(xù)執(zhí)行而產(chǎn)生觸發(fā);
第二種情況:在進(jìn)行dml操作前,驗(yàn)證對(duì)應(yīng)操作合法性,那么觸發(fā)器必須使用before

關(guān)于ora-04091異常的出現(xiàn)原因:

在oracle中執(zhí)行dml語句的時(shí)候是需要顯示進(jìn)行提交操作的。當(dāng)我們進(jìn)行插入的時(shí)候,會(huì)觸發(fā)觸發(fā)器執(zhí)行對(duì)觸發(fā)器作用表和擴(kuò)展表的種種操作,但是這個(gè)時(shí)候觸發(fā)器和插入語句是在同一個(gè)事務(wù)管理中的,因此在插入語句沒有被提交的情況下,我們無法對(duì)觸發(fā)器作用表進(jìn)行其他額外的操作。如果執(zhí)行其他額外的操作則會(huì)拋出如上異常信息

我們知道,出錯(cuò)的原因是因?yàn)橛|發(fā)器和dml語句在同一事務(wù)管理中,所以方案一便是將觸發(fā)器和dml語句分成兩個(gè)單獨(dú)的事務(wù)處理。這里可以使用pragma autonomous_transaction; 告訴oracle觸發(fā)器是自定義事務(wù)處理。

關(guān)于oracle行級(jí)觸發(fā)器的使用的文章就介紹至此,更多相關(guān)oracle行級(jí)觸發(fā)器內(nèi)容請(qǐng)搜索碩編程以前的文章,希望以后支持碩編程!

下一節(jié):關(guān)于ora-04091異常的出現(xiàn)原因分析及解決方案

oracle數(shù)據(jù)庫

相關(guān)文章
學(xué)習(xí)SQLite
亚洲国产精品第一区二区,久久免费视频77,99V久久综合狠狠综合久久,国产免费久久九九免费视频