Oracle触发器:如果数据库B中不存在该值,则在数据库A的表中显示错误

时间:2017-04-04 13:32:08

标签: sql oracle triggers

我有两个表,但这些表是在不同的数据库中。我想要做的是创建一个触发器,当我更新STUDENT表,并且我进入大学表中不存在的大学时,它应该显示错误。但是我没有收到任何错误。以下是我的尝试:

表:

 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 university@DatabaseA 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中大学表中不存在大学的位置,我没有收到任何错误,只是让#0; 0行受到影响&#39;:

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

如果我输入的大学名称在DatabaseA的UNIVERSITY表中不存在,如何显示错误

1 个答案:

答案 0 :(得分:2)

对于符合更新语句条件的表的每一行,执行更新触发器。

在第二种情况下

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

没有行受到影响,因此根本不会执行触发器。