2011-04-16 145 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