PL / SQL триггерный вопрос - PullRequest
2 голосов
/ 16 апреля 2011

У меня есть вопрос относительно того, когда срабатывает триггер 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;

Триггер не срабатывает.Есть ли какие-либо вопросы о том, как я могу вызвать срабатывание курка?

Спасибо!

Ответы [ 2 ]

10 голосов
/ 16 апреля 2011

Ваш триггер является триггером вставки. Триггеры вставки не запускаются для операторов обновления. Вместо этого вы должны использовать что-то вроде этого:

BEFORE UPDATE ON GRADE
9 голосов
/ 16 апреля 2011

Также:

  1. Триггер не будет препятствовать обновлению, так как вы перехватываете исключение внутри самого триггера и никогда не вызываете его повторно, и,
  2. Если вы не используете "клиент", который "видит" , а ищет DBMS_OUTPUT (а многие этого не делают), вы даже не увидите вывод DBMS_OUTPUT.PUT_LINE.

Чтобы решить обе эти проблемы, вы можете:

  1. Удалить блок исключений и
  2. Используйте RAISE_APPLICATION_ERROR (с вашим пользовательским сообщением об ошибке) вместо RAISE.

Однако для относительно простых ограничений, подобных этим, есть хорошие аргументы для использования ограничения CHECK вместо триггера, такие как производительность, корректность, ремонтопригодность и «декларативность».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...