Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql Oracle触发器:如果数据库B中不存在值,则在数据库a中的表中显示错误_Sql_Oracle_Triggers - Fatal编程技术网

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

Sql Oracle触发器:如果数据库B中不存在值,则在数据库a中的表中显示错误,sql,oracle,triggers,Sql,Oracle,Triggers,我有两个表,但这些表在不同的数据库中。我试图做的是创建一个触发器,当我更新学生表时,当我输入大学表中不存在的大学时,它应该向我显示一个错误。然而,我没有得到任何错误。以下是我的尝试: 表: UNIVERSITY - DatabaseA | Student(PK) | State | | A | X State | | B | Y State | | C | B State | STUDENT - DatabaseB |

我有两个表,但这些表在不同的数据库中。我试图做的是创建一个触发器,当我更新学生表时,当我输入大学表中不存在的大学时,它应该向我显示一个错误。然而,我没有得到任何错误。以下是我的尝试:

表:

 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;
但是,当我执行如下所示的更新时,如果我尝试更新数据库A中大学表中不存在的大学,则不会出现错误,只会得到“0行受影响”:

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

如果我输入的大学名称在数据库的大学表中不存在,如何使其显示错误a

将对满足update语句条件的表的每一行执行update触发器

在第二种情况下

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

不影响任何行,因此根本不执行触发器。

对满足update语句条件的表的每一行执行update触发器

在第二种情况下

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

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

为什么名为
University
的表有一个名为
Student
的主键列?您的数据结构看起来非常笨拙。很抱歉,学生表有一个由大学名和学生名组成的复合主键。我编辑了我的问题请将更新声明的表名从
房间调整为
学生
为什么名为
大学
的表有一个名为
学生
的主键列?您的数据结构看起来非常笨拙。很抱歉,学生表有一个由大学名和学生名组成的复合主键。我编辑了我的问题,请将更新声明的表名从
房间
调整为
学生
啊哈,这非常有意义,谢谢你,弗兰克,非常感谢你的帮助啊哈,这非常有意义,谢谢你,弗兰克,非常感谢你的帮助