2017-04-04 9 views
0

2つのテーブルがありますが、これらのテーブルはDIFFERENT DATABASEにあります。私がやろうとしているのは、STUDENTテーブルを更新し、UNIVERSITYテーブルに存在しない大学に入ると、エラーが表示されるはずのトリガーを作成することです。しかし、私は何の誤りもありません。ここに私の試みは、以下のとおりです。Oracle Trigger:値がデータベースBに存在しない場合、データベースAのテーブルにエラーを表示します

表:

UNIVERSITY - DatabaseA 
| Student(PK) | State | 
| A   | X State | 
| B   | Y State | 
| C   | B State | 

STUDENT - DatabaseB 
| Student_Name (PK) | Grade  | University (PK)(FK) | 
| James    | D   | A    | 
| Andrew   | HD   | B    | 
| James    | D   | C    | 

トリガー:

DELIMITER // 
CREATE OR REPLACE TRIGGER student_trigger 
BEFORE UPDATE ON student 
FOR EACH ROW 
DECLARE temp_count INTEGER; 
BEGIN 
    SELECT COUNT(*) INTO temp_count 
    FROM [email protected] u 
    WHERE u.Student = :OLD.Student; 

    IF (temp_count < 1) 
     THEN RAISE_APPLICATION_ERROR(-20101, 'Error:Uni doesnt exist'); 
    END IF; 
END; 

これは動作し、更新が正常である:

UPDATE student 
SET Grade = 'C' 
WHERE Student_Name = 'James' 
AND University = 'A'; 

しかし、私は、更新を実行すると、以下のようにどこの大学がDatabaseAのUniversityテーブルに存在しないかを更新しようとすると、エラーは発生しません。私は入れ大学名がDatabaseA

+2

なぜ「大学」というテーブルに「学生」と呼ばれる主キー列がありますか?あなたのデータ構造は非常に扱いにくいようです。 –

+0

申し訳ありませんが、学生テーブルには大学名と学生名の複合主キーがあります。私は自分の質問を編集しました – iPho

+0

あなたの更新文のtablenameを 'room'から' student'に調整してください –

答えて

2

でUNIVERSITYテーブルに存在しない場合、私はそれがエラーを表示するために取得するにはどうすればよいあなたの更新トリガーがある

UPDATE student 
SET Grade = 'C' 
WHERE Student_Name = 'James' 
AND University = 'something_that_doesnt_exist'; 

:ちょうど「影響を受けた0行」を取得ND更新文の条件を満たすテーブル各行に対してを実行しました。

UPDATE student 
SET Grade = 'C' 
WHERE Student_Name = 'James' 
AND University = 'something_that_doesnt_exist'; 

行が影響されない第2のケースで

は、したがって、トリガがまったく実行されません。

+0

ああ、完璧な意味があります、ありがとうございます。 – iPho

関連する問題