1. 程式人生 > >Oracle觸發器給表自身的欄位重新賦值出現ORA-04091異常

Oracle觸發器給表自身的欄位重新賦值出現ORA-04091異常

業務描述如下:

在插入一個表的時候,需要根據一個欄位的值更新另一個欄位的值。當然也可以通過程式就能很簡單得實現,只是這個欄位只是資料交換用,和系統業務沒關係,不想修改程式,所以才用觸發器的方式實現。

表結構定義和觸發器定義如下:

create table debug_demo1(
id varchar(32),
name varchar(100),
note varchar(200),
primary key(id)
);

create or replace trigger tri_debug_demo1
before insert on debug_demo1
for each row
begin
update debug_demo1 set note = 'test' where id = :new.id;
end tri_debug_demo1;

結果執行insert操作的時候,Oracle出現了ORA-04091異常

ORA-04091:表debug_demo1發生了變化 觸發器/函式不能讀它  
ORA-06512: 在tri_debug_demo1 line...
ORA-04088: 觸發器tri_debug_demo1 執行過程中出錯  

修改之後的觸發器如下:

create or replace trigger tri_debug_demo1
before insert on debug_demo1
for each row
begin
:new.note := 'test';
end tri_debug_demo1;

經過測試,可以正常進行insert操作,也能達到預期。