2012-05-25 65 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,「當我遇到突變表錯誤時,我的邏輯中出現了一個嚴重的致命缺陷 。」