0
作爲審計/歷史記錄功能的一部分,我想使用AFTER UPDATE觸發器或任何其他觸發器來處理以下情形,請讓我知道。 方案 -Oracle中AFTER UPDATE觸發器中的死鎖場景
- 將有2個表 - 基表和歷史表
- 在基表中的第一個插入相同記錄的任何記錄的更新(更新)歷史上的表舊值。
- 使用基礎表中的新值更新記錄。
我正在使用以下觸發器,給出死鎖情況。請建議解決此問題。
create table Base_table(
SYMBOL_ID NUMBER(9) primary key,
SYMBOL_NAME VARCHAR2(20) ,
PRICE NUMBER(9) ,
VERSION NUMBER(1)
)
organization index;
create table base_table_hist(
ID NUMBER(9) primary key,
SYMBOL_ID NUMBER(9) ,
SYMBOL_NAME VARCHAR2(20) ,
PRICE NUMBER(9),
VERSION NUMBER(1) ,
constraint other_symbolid foreign key(symbol_id) references test_symbol(symbol_id)
)
organization index;
************************************************************
create or replace Trigger Symbol_Ver
AFTER UPDATE ON Base_table
REFERENCING NEW AS New OLD AS Old
FOR EACH ROW
DECLARE
new_version number(5);
--Pragma AUTONOMOUS_TRANSACTION;
Sid number(9);
begin
if (:New.symbol_id <> :Old.symbol_id) OR (:New.price <> :Old.price) then
new_version:= :Old.version+1;
--insert into history table
insert into base_table_hist (id, symbol_id, symbol_name,price,version)
values (symbol_seq.nextval, :OLD.symbol_id, :OLD.symbol_name, :OLD.price, :OLD.version);
commit;
DBMS_OUTPUT.put_line('new_version..'||new_version);
end if;
if (:New.symbol_id <> :Old.symbol_id) OR (:New.price <> :Old.price) then
update base_table set version=new_version where symbol_id=:Old.symbol_id;
end if;
end;
真的是一個僵局?不是一個突變的表錯誤,或資源不足(因爲觸發器會重複從它內部的recursove更新)? –
顯示它的死鎖錯誤(ORA-00060)。爲避免反覆發生火災情況(如:New.version = Old.Version),則執行INSERT和UPDATE操作。 – SandeepS
但是你還在發射一個額外的更新,這很醜,我很驚訝的作品。你爲什麼不調整版本(設置':new.version'),並在'before'觸發器中創建歷史記錄,而不是做額外的DML? –