如何在某些情况下修复触发器代码,以防止插入

问题描述 投票:0回答:1

我正在尝试创建一个有问题的触发器。触发器的工作是阻止该项目插入。这里有2张学生和科目表。我必须检查并防止在该学生尚未注册该科目时插入,如果有,他将在下个学期开始学习,因此目前他还没有注册。请帮助我。

CREATE OR REPLACE TRIGGER check_student 
BEFORE INSERT ON subject
FOR EACH ROW
BEGIN
    IF :new.student_no and :new.student_name  NOT IN (SELECT DISTINCT student_no,student_name from student) 
    or 
    :new.student_enrollment_date < (select min(enrolment_date) from student where student.student_name = :new.student_name and student.student_no = :new.guest_no group by student.student_name , student.student_no)
    and :new.student_name = (select distinct student_name from student)
    and :new.student_no = (select distinct student_no from student)
    THEN
        raise_application_error(-20000, 'Person must have lived there');
    END IF;
END;
/

我必须检查并防止在学生尚未报名该科目时插入,如果有,他将从下一个学期开始,所以目前他还没有报名。请帮助我。

oracle plsql database-trigger
1个回答
0
投票

您在您的情况下可能有逻辑上的先决问题,因为它包含ANDOR,没有任何括号。

但是总的来说,我认为可以通过对子查询使用唯一的NOT EXISTS条件来简化代码,该子查询可以一次检查是否满足所有功能条件。这应该非常接近您想要的内容:

create or replace trigger check_student 
before insert on subject
for each row
begin
    if not exists (
        select 1
        from student
        where 
            name = :new.student_name 
            and student_no = :new.student_no
            and enrolment_date <= :new.student_enrollment_date 
    ) then
        raise_application_error(-20000, 'Person must have livd there');
    end if;
end;
/

注意:目前尚不清楚:new.guest_no的用途,所以我暂时将其保留下来(我假设您的意思是:new.student_no。]]

© www.soinside.com 2019 - 2024. All rights reserved.