PL / SQL触发触发问题

| 我对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;
触发器不会触发。 关于如何使扳机开火有什么要点吗? 谢谢!     
已邀请:
您的触发器是插入触发器。插入触发器不会触发更新语句。您应该改用以下方式:
BEFORE UPDATE ON GRADE
    
也: 触发器不会阻止更新,因为您在触发器本身中捕获了异常,并且永远不会重新引发它,并且, 除非您使用的是\\\\\\\\\\\\\\\\\\\\\\\的客户端\\\\\\\\\\\\\\\ s \\\\\\\\\\\\\\\ s \ s \ s \ s \ s寻找DBMS_OUTPUT(很多都没有),否则您甚至都不会看到DBMS_OUTPUT.PUT_LINE输出。 要解决这两个问题,您可以: 完全删除异常块,然后, 使用RAISE_APPLICATION_ERROR(带有您的自定义错误消息)而不是RAISE。 但是,对于像这样的相对简单的约束,存在使用CHECK约束而不是触发器的良好论据,例如性能,正确性,可维护性和“声明性”。     

要回复问题请先登录注册