2011-04-16 135 views
2

我有一个关于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; 

触发不火。 关于如何让触发器触发的任何观点?

谢谢!

回答

10

您的触发器是插入触发器。插入触发器不会触发更新语句。你应该使用这样的事情,而不是:

BEFORE UPDATE ON GRADE 
+0

哈!我是个忘了那个白痴。谢谢! – user711330 2011-04-16 16:56:33

9

另外:

  1. 触发器将不会阻止更新,因为您捕捉触发中的异常本身并永不再提高它,并
  2. 除非您使用“看到”正在查找DBMS_OUTPUT(许多不会)的“客户端”,否则您甚至不会看到DBMS_OUTPUT.PUT_LINE输出。

为了解决这两个问题,你可以:

  1. 完全消除异常块,并且,
  2. 使用RAISE_APPLICATION_ERROR(与你的自定义错误消息),而不是加薪。

但是,对于像这样的相对简单的约束,使用CHECK约束而不是触发器(如性能,正确性,可维护性和“声明性”)有很好的参数。哈哈!

+0

+1。好点。欣赏它。 – Guru 2011-04-16 17:41:57

+0

我发誓在未来的所有软件文档中都使用“声明性”。 – 2013-07-16 18:57:56