2016-09-27 9 views
0

でトリガを変異さ:あなたはトリガによって追加カントは、私は次の表を作成するには、Oracle

insert into lessons values (001,'Peter','Thomas',to_date('2015-12-15','YYYY-MM-DD'),to_date('2015-12-22','YYYY-MM-DD')); 
insert into lessons values (002,'Eli','Alice',to_date('2015-06-16','YYYY-MM-DD'),to_date('2015-06-23','YYYY-MM-DD')); 
insert into lessons values (003,'Daniel','Thomas',to_date('2015-08-15','YYYY-MM-DD'),to_date('2015-08-20','YYYY-MM-DD')); 

データ:

create table lessons(
id number, 
name_teacher varchar2(9), 
name_student varchar2(40), 
start_lesson date, 
end_lesson date 
); 

私は、次の件のデータを挿入します。

insert into lessons values (001,'Peter','Alice',to_date('2015-12-16','YYYY-MM-DD'),to_date('2015-12-25','YYYY-MM-DD')); 
insert into lessons values (002,'Eli','Thomas',to_date('2015-06-13','YYYY-MM-DD'),to_date('2015-06-20','YYYY-MM-DD')); 

質問は、私は「ピーター」または「イーライ」のように、時間的に重複教師を持っている学生を追加することはできません、トリガーを作成する方法です。

---私の問題---

オラクルは私変異体表のエラーを返します。

+2

ポストあなたのトリガー本体 – XING

+2

情報が不十分。トリガーコードも投稿してください。 –

+0

あなたの質問のように見えるのは、本当に簡単な解決策がない古い問題である範囲の重複を防ぐことです。 "mutating table"エラーを回避するのは簡単ですが、マルチユーザーシステムでは、2つのセッションが自分のセッションで有効な行を入力するのを防ぐためにはまだロックが必要ですが、 –

答えて

1

は、あなたが挿入/更新トリガ後neenその火comlete挿入または更新した後とではないearchが行の後:

create or replace trigger check_intersections_trg 
on 
lessons 
after insert or update 
declare 
    v_res NUMBER; 
begin 
    select count(*) 
    into v_res 
    from lessons l1 
    join lessons l2 on l1.name_student = l2.name_student 
        and l1.start_lesson <= l2.end_lesson 
        and l2.start_lesson <= l1.end_lesson 
    ; 
    if v_res > 0 than 
    raise_application_error(-20999, 'intersection found'); 
    end if; 
end; 
/
関連する問題