Неизвестная ошибка при выполнении триггера - PullRequest
0 голосов
/ 28 августа 2018

У меня настроен триггер вставки / обновления, который запрещает сотруднику одновременно существовать в двух таблицах. Он отлично работает с перехватом нелегальных вставок / обновлений, но я также получаю еще одно сообщение об ошибке при тестировании триггера с недопустимыми вставками / обновлениями.

Вот мой код:

CREATE OR REPLACE TRIGGER check_foobar
BEFORE INSERT OR UPDATE OF VarX ON FOOBAR
FOR EACH ROW
DECLARE
    counter NUMBER(38);
BEGIN  
    SELECT count(*)
    INTO counter
    FROM BARFOO
    WHERE VarX = :NEW.VarX
    GROUP BY VarX;

IF counter > 0 THEN 
    RAISE_APPLICATION_ERROR(-20001, 'This is an illegal insertion/update');
    END IF;

EXCEPTION WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('TEST');

END;
/

А в ошибках ORA-06512 и ORA-04088 я не уверен:

SQL> INSERT INTO DRIVER VALUES(2,  10345, 'AVAILABLE');

Error starting at line : 26 File @test.sql
In command -
INSERT INTO FOOBAR VALUES(2)
Error report -
ORA-20001: This is an illegal insertion/update
ORA-06512: at "HR.CHECK_FOOBAR", line 11
ORA-04088: error during execution of trigger 'HR.CHECK_FOOBAR'

Когда я добавляю обработчик исключений для оператора select, мой триггер перестает работать правильно, и запрещенная вставка не предотвращается. Но ошибка выполнения предотвращена.

ОБНОВЛЕНИЕ: я добавил группу и исключение для триггера, так что теперь триггер все еще работает с обработчиком исключений, но ошибки ORA-06512 и ORA-04088 по-прежнему приводят к недопустимой вставке / обновлению.

В сообщении об ошибке указана строка 11

GROUP BY VarX;

Любой совет будет высоко ценится.

Ответы [ 2 ]

0 голосов
/ 28 августа 2018

Здесь нет проблем, все работает как положено.

Error starting at line : 26 File @test.sql
In command -
INSERT INTO FOOBAR VALUES(2)

Это относится к строке в вашем скрипте, где у вас есть оператор INSERT. Это говорит о том, что на данном этапе было возбуждено исключение.

Error report -

Это показывает стек ошибок:

ORA-20001: This is an illegal insertion/update

Это действительное исключение, которое было возбуждено.

ORA-06512: at "HR.CHECK_FOOBAR", line 11
ORA-04088: error during execution of trigger 'HR.CHECK_FOOBAR'

Это дополнительные сообщения, просто чтобы сообщить вам, где первоначально возникло исключение, в данном случае, в вашем триггере в строке 11, где RAISE_APPLICATION_ERROR, как вы могли ожидать. Обратите внимание, что номера строк для триггеров относятся к исполняемой части триггера, поэтому в вашем случае DECLARE - это строка 1.

0 голосов
/ 28 августа 2018

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

CREATE OR REPLACE TRIGGER check_foobar
BEFORE INSERT OR UPDATE OF VarX ON FOOBAR
FOR EACH ROW
DECLARE
    counter NUMBER(38);
    BEGIN  
       SELECT count(*)
       INTO counter
       FROM BARFOO
       WHERE VarX = :NEW.VarX
       GROUP BY VarX;

    IF counter > 0 THEN 
       RAISE_APPLICATION_ERROR(-20001, 'This is an illegal insertion/update');
    END IF;

EXCEPTION 
   WHEN NO_DATA_FOUND THEN 
      DBMS_OUTPUT.PUT_LINE('TEST');
   WHEN OTHERS THEN
      IF SQLCODE = -20001 THEN
        -- do some logging
        RAISE;
      ELSE
        -- do some logging and any other actions you feel are needed.   Then depending on needs you can raise or not.

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