关于何时触发PL / SQL触发器,我有一个问题。
我写过以下触发器
CREATE OR REPLACE TRIGGER gradeInputCheck
BEFORE INSERT ON GRADE
FOR EACH ROW
DECLARE
newGrade GRADE.NUMERIC_GRADE%TYPE := :NEW.NUMERIC_GRADE;
grade_too_low EXCEPTION;
grade_too_high EXCEPTION;
BEGIN
DBMS_OUTPUT.PUT_LINE(newGrade);
IF (newGrade < 0) THEN
RAISE grade_too_low;
ELSIF (newGrade > 100) THEN
RAISE grade_too_high;
END IF;
EXCEPTION
WHEN grade_too_low THEN
DBMS_OUTPUT.PUT_LINE('Grades must be between 0 and 100');
WHEN grade_too_high THEN
DBMS_OUTPUT.PUT_LINE('Grades must be between 0 and 100');
END;
但是,当我运行像
这样的简单语句时UPDATE grade SET numeric_grade = -1;
触发器不会触发。 关于如何使触发器触发的任何要点?
谢谢!
答案 0 :(得分:10)
您的触发器是插入触发器。插入触发器不会触发更新语句。你应该使用这样的东西:
BEFORE UPDATE ON GRADE
答案 1 :(得分:9)
此外:
要解决这两个问题,您可以:
但是,对于像这样的相对简单的约束,使用CHECK约束而不是触发器有很好的参数,比如性能,正确性,可维护性和“声明性”。