감사/기록 기능의 일부로 AFTER UPDATE 트리거 또는 다른 트리거를 사용하여 다음 시나리오를 처리하려면 알려주십시오. 시나리오 -오라클의 AFTER UPDATE 트리거의 교착 상태 시나리오
- 이 것이 개 테이블 - 기본 테이블 1 삽입 동일한 레코드의 모든 기록의 갱신에
- (업데이트 예정) 기본 테이블과 역사 테이블을 이전 값과 역사 테이블입니다.
- 기본 테이블에 새 값으로 레코드를 업데이트하십시오.
교착 상태 시나리오를 제공하는 다음 트리거를 사용하고 있습니다. 이 문제를 해결하려면 조언을 제공해주십시오.
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;
정말 교착 상태입니까? mutuating table 오류가 아니거나 리소스가 부족합니다 (트리거가 반복 된 업데이트에서 반복적으로 실행되므로)? –
데드락 오류 (ORA-00060)가 표시됩니다. 반복적으로 화재 조건이 (if : New.version = Old.Version)로 변경된 다음 INSERT 및 UPDATE 조작으로 변경되지 않도록하십시오. – SandeepS
하지만 여전히 추한 업데이트를 해고하고 있으며, 나는 놀란 작품입니다. 왜 DML을하기보다는'before' 트리거로 버전을 조정하고 ('new.version'을 설정하는 것), 히스토리 레코드를 만드는 것이 아닌가? –