2012-05-25 10 views
0

삽입중인 값을 이미 테이블에있는 값과 비교해야하는 트리거를 만듭니다. 삽입하기 때문에 이전 참조자를 여기에서 작동하지 않지만 어떻게 내가 이미 존재하는 참조 할 수 있습니까? 여기 내 테이블과 트리거 : 당신은 일반적으로 당신이 트리거에 삽입하고있는 테이블에서 선택할 수 없습니다sql 트리거 - 기존 행 값을 삽입중인 값과 비교하려고합니다.

create table events(eid char(2) primary key, cid char(2)); 

    create table activities(mid char(2), eid char(2), 
    primary key (mid, eid), 
    constraint activities_fk foreign key (eid) references events(eid)); 

    create or replace trigger check_valid 
    before insert or update on activities 
    for each row when (old.mid=new.mid) 
    declare 
v_eid char(2); 
v_cid char(2); 
n_cid char(2); 

    begin 
select eid into v_eid from activities 
where mid=:new.mid; 

select cid into v_cid from events 
where eid=v_eid; 

select cid into n_cid from events 
where eid=:new.eid; 

if v_cid=n_cid then 
    raise_application_error(-20000, 'Error'); 
end if; 
    end check_valid; 
    /
    show errors; 

답변

0

. 이것은 돌연변이 표 문제입니다. 또는 제가 종종 "돌연변이 표 문제"라고 부릅니다.

기본적으로 이렇게하지 마십시오. 나쁜 생각이야. 한 번에 두 세션이 테이블에서 작동하면 어떻게됩니까? 트리거가 실행되고 두 세션은 트리거 이후 커밋 때까지 다른 세션이 수행 한 작업을 보지 않습니다. 그런 다음 데이터베이스에 예기치 않은 데이터가 있습니다.

Tom Kyte says "돌연변이 테이블 오류가 발생했을 때 심각한 치명적인 결함이 발생했습니다. 내 논리는 입니다."

관련 문제