表xxx發生了變化,觸發器/函式不能讀它
當刪除表中的資料的時候,報錯了,是觸發器/函式不能讀它
我的觸發器是當一個表中的資料改變(增、刪、改)後,操作另一張表中的資料,對另一張表中的資料進行增刪操作。
我修改後的觸發器是這樣的,在declare語句塊裡面加了“pragma autonomous_transaction;“,讓oracle知道觸發器是自定義事物處理。原因應該是當刪除一張表中的資料時,我同時要修改另一張表的資料。如果刪除時沒有commit,則會影響另一張表的操作。因為這是兩個事物。兩個事物衝突了,就出現錯誤了。
下面是我修改後的觸發器,修改了兩點:一是在declare語句塊加了“pragma autonomous_transaction;“ 二是在涉及到的insert、update、delete 語句後面加上了commit;
create or replace trigger AMC_SAP_VOUCHER_HR_QX_T
after insert or update or delete on xip.AMC_SAP_VOUCHER_HR_QX
for each row
declare
is_exist number;
is_exist_user_role number;
emp_count number;
pragma autonomous_transaction;
begin
case
when inserting then
select count(*) into is_exist from t_user_role r where r.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6'and r.c_userid = :new.empnumber;
if is_exist=0 then
insert into t_user_role values(:new.empnumber,'I8ad99053015525f625f6e770015529d2fc3f0bf6');
commit;
end if;
when updating then
if :new.empnumber=:old.empnumber then
return;
else
--刪除舊的
select count(*) into emp_count from xip.AMC_SAP_VOUCHER_HR_QX t where t.empnumber = :old.empnumber;
if is_exist=0 then
select count(*) into is_exist_user_role from t_user_role r where r.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6'and r.c_userid = :old.empnumber;
if is_exist_user_role>0 then
delete from t_user_role tr where tr.c_userid = :old.empnumber and tr.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6';
commit;
end if;
end if;
--插入新增的
select count(*) into is_exist from t_user_role r where r.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6'and r.c_userid = :new.empnumber;
if is_exist=0 then
insert into t_user_role values(:new.empnumber,'I8ad99053015525f625f6e770015529d2fc3f0bf6');
commit;
end if;
end if;
when deleting then
--一個使用者可能對應多個org,在資料庫中有多條記錄,刪除某條使用者並不代表把這個使用者全部刪除了
select count(*) into is_exist from xip.AMC_SAP_VOUCHER_HR_QX t where t.empnumber = :old.empnumber;
if is_exist=0 then
select count(*) into is_exist_user_role from t_user_role r where r.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6'and r.c_userid = :old.empnumber;
if is_exist_user_role>0 then
delete from t_user_role tr where tr.c_userid = :old.empnumber and tr.c_roleid = 'I8ad99053015525f625f6e770015529d2fc3f0bf6';
commit;
end if;
end if;
end case;
end AMC_SAP_VOUCHER_HR_QX_T;