觸發器 自治事務

2021-05-26 07:55:39 字數 1537 閱讀 7200

原帖位址

問題如下

表 ksource.userinfo 發生了變化, 觸發器/函式不能讀它 

userinfo(userid,username,departid,serialnum,…) 

對於乙個部門(departid相同)下的使用者,我要讓其序號serialnum保持連續,就建立了乙個觸發器:

引用:

create or replace trigger 「ksource」.truserinfo_insert 

after 

insert on 「ksource」.」userinfo」 

referencing old as old new as new 

for each row 

declare 

v_serialnum number; 

begin 

select count(*) into v_serialnum from userinfo where departid=:new.departid; 

if (:new.serialnum v_serialnum) then 

update userinfo set serialnum=v_serialnum where userid=:new.userid; 

end if; 

end;

解決的方式

就是這裡可以通過一些autonomous_transaction(自治事務)來解決

或者是用表級別的trigger和行級trigger搭配,行級trigger做標記,表級別的trigger來做操作。配合著package裡的臨時變數儲存標記。

一下是簡單的處理方式,自治事務

引用:

create or replace trigger 「ksource」.truserinfo_insert 

after 

insert on 「ksource」.」userinfo」 

referencing old as old new as new 

for each row 

declare 

v_serialnum number; 

pragma autonomous_transaction; 

begin 

select count(*) into v_serialnum from userinfo where departid=:new.departid; 

if (:new.serialnum v_serialnum) then 

update userinfo set serialnum=v_serialnum where userid=:new.userid; 

end if; 

commit; 

end;

你試試這個解決方式叻,不過對於你這case,確實比較複雜,在你delete一條中間的資料時,確實還要控制其他的serialnum也隨之發生變化。這樣才能保持連續 

由於是自治形式的,所以在你的程式塊裡,最後需要加上commit;

自治事務參考

在觸發器中操作觸發此觸發器的表,用 pragma autonomous transaction 選項。自治事務理解 一般情況下利用觸發器禁止某些對錶的更新等操作時,若記錄日誌,則觸發器最後丟擲異常時會造成日誌回滾。利用自治事務可防止此點。對資料庫有寫操作 insert update delete c...

oracle的自治事務

create or replace procedure testa a varchar2,b varchar2 is vs str varchar2 10 begin insert into test table t values a vs str b testb bs str rollback e...

觸發器 事務

觸發器 業務是緊密相連的,不可分割的,可以使用觸發器 觸發器的四個要素 1.監視地點 2.監視事件 3.觸發時間 4.觸發事件 after 在之後,當我監視事件發生增刪改以後,進行觸發 before 先完成觸發,再進行增刪改。監視事件之前 建立觸發器的語法 create trigger 觸發器名稱 ...