2012-05-25 3 views
0

Я создаю триггер, который должен сравнивать значения, вставленные с теми, которые уже существуют в таблице. Старый референс не работает здесь, потому что я вставляю, но как я могу ссылаться на то, что уже существует? Вот мои таблицы и триггер:sql triggers - хотите сравнить существующее значение строки со вставленным значением

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, «когда я ударил ошибку мутирующего стола, у меня есть серьезная фатальная ошибка в моей логике».

Смежные вопросы