0

挿入される値をテーブルに既に存在する値と比較するトリガーを作成しています。ここでは挿入しているため、古いリファレンサーは機能しませんが、既に存在するものを参照するにはどうすればよいですか? ここに私のテーブルとトリガーがあります:

    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;
4

1 に答える 1

0

通常、トリガーに挿入しているテーブルから選択することはできません。これは変化するテーブルの問題、または私がよく呼ぶように、「いまいましい変化するテーブルの問題」です。

基本的に、これはしません。それは悪い考えです。テーブルで同時に 2 つのセッションを実行するとどうなりますか? トリガーが起動し、どちらのセッションも、トリガーの後のコミットまで、他のセッションが何をしたかを確認しません。次に、データベースに予期しないデータがあります。

Tom Kyte は次のように述べています。

于 2012-05-25T03:37:43.077 に答える