2015-03-11 2 views
0

Написать триггер базы данныхMutating Таблица ошибки в триггере уровня строки

  1. Halt сделку между временем 6 вечера до 10 утра на столе
  2. Дайте соответствующее сообщение, если запись превышать более чем на 10
  3. Удалить данные старше 2 месяцев с понедельника по субботу и дату не должно быть 1-го числа месяца. (т.е. оставить воскресенье & 1 МЕСЯЦА данных старше 2 месяцев)

Я попробовал этот код,

CREATE OR REPLACE TRIGGER EMP_INFO_BFT BEFORE 
    INSERT OR DELETE OR UPDATE ON EMP_INFO 
    FOR EACH ROW 
    DECLARE l_TIME NUMBER(10); 
    l_RECORD NUMBER; 
    BEGIN 
    l_TIME:=TO_CHAR(SYSDATE,'HH24'); 
    IF l_TIME NOT BETWEEN 18 AND 10 THEN 
    RAISE_APPLICATION_ERROR(-20003,'TIME ALREADY OVER.....TRANSACTION NOT ALLOWED NOW'); 
    END IF; 
    DELETE 
    FROM EMP_INFO 
    WHERE TRUNC (HIRE_DATE)    < ADD_MONTHS (TRUNC (SYSDATE), -2) 
    AND TO_CHAR (TRUNC (HIRE_DATE), 'DY') != 'SUN' 
    AND TO_CHAR (TRUNC (HIRE_DATE), 'DD') != '01'; 
    SELECT COUNT(*) INTO l_RECORD FROM EMP_INFO; 
    IF l_RECORD>=10 THEN 
     RAISE_APPLICATION_ERROR(-20005,'10 RECORD ALLOWED IN EMP_INFO TABLE'); 
    END IF; 
    END; 

Я получил мутирует ошибку при вставке.

ответ

0

Минимальное видоизменение ошибка

Check this link, который в основном говорит:.

«Если триггер действительно приводит к ошибке Mutating таблицы, единственным реальным вариантом является переписать триггер в качестве триггера оператор уровня

Ошибки в мутировальных таблицах влияют только на триггеры уровня строки. "

Ваш код не ссылается :NEW или :OLD, поэтому его изменение на триггер уровня инструкций должно быть простым, просто удалите FOR EACH ROW.

PS

Я не думаю, что ваш BETWEEN будет работать.

Изменение

IF l_TIME NOT BETWEEN 18 AND 10 THEN 

в

IF l_TIME BETWEEN 10 AND 18 THEN 
    NULL; 
ELSE 

бы это исправить.

0

Сделать этот триггер в качестве автономного запуска, проверьте следующий код:

CREATE OR REPLACE TRIGGER EMP_INFO_BFT BEFORE 
    INSERT OR DELETE OR UPDATE ON EMP_INFO 
    FOR EACH ROW 
    DECLARE l_TIME NUMBER(10); 
    l_RECORD NUMBER; 
pragma autonomous_transaction; 
    BEGIN 
    l_TIME:=TO_CHAR(SYSDATE,'HH24'); 
    IF l_TIME NOT BETWEEN 18 AND 10 THEN 
    RAISE_APPLICATION_ERROR(-20003,'TIME ALREADY OVER.....TRANSACTION NOT ALLOWED NOW'); 
    END IF; 
    DELETE 
    FROM EMP_INFO 
    WHERE TRUNC (HIRE_DATE)    < ADD_MONTHS (TRUNC (SYSDATE), -2) 
    AND TO_CHAR (TRUNC (HIRE_DATE), 'DY') != 'SUN' 
    AND TO_CHAR (TRUNC (HIRE_DATE), 'DD') != '01'; 
    commit; 
    SELECT COUNT(*) INTO l_RECORD FROM EMP_INFO; 
    IF l_RECORD>=10 THEN 
     RAISE_APPLICATION_ERROR(-20005,'10 RECORD ALLOWED IN EMP_INFO TABLE'); 
    END IF; 
    END; 
Смежные вопросы