2016-11-28 7 views
0

Я хочу создать триггер «вместо delete», чтобы ограничить удаление строки, когда введенное значение превышает определенную сумму.Oracle SQL вместо удаления триггера

У меня есть таблица счета-фактуры с 2 колонками: счет-фактура (InvoiceID Количество, Общее количество)

Я хочу, триггер срабатывает при попытке удалить строку, которая имеет сохраненное значение в Total> = 100 и предотвратить удаление.

До сих пор у меня есть приблизительный эскиз того, что я хочу, но я не уверен, правильный ли точный синтаксис.

CREATE OR REPLACE TRIGGER IOFD_INVOICE 
INSTEAD OF DELETE ON INVOICE 
BEGIN 
    DECLARE 
    TTL INTEGER; 

    SELECT TOTAL = TTL 
    FROM INVOICE 

    IF TTL >= 100 
    BEGIN 
    RAISERROR('Record cannot be deleted.') 
    ROLLBACK 
    END 

    ELSE 
    BEGIN 
    DELETE FROM INVOICE 
    END 

END; 

Я думал, что вместо триггеров может быть использован на столах, но я получаю следующее сообщение об ошибке: Сообщение

Error report - 
ORA-25002: cannot create INSTEAD OF triggers on tables 
25002. 00000 - "cannot create INSTEAD OF triggers on tables" 
*Cause: Only BEFORE or AFTER triggers can be created on a table. 
*Action: Change the trigger type to BEFORE or AFTER. 
+1

«но я не уверен, что если точный синтаксис является правильным.» что говорит г-н БД, когда вы работаете в фиктивной БД? –

+0

@MitchWheat благодарит запомнить мне. Обновлено для добавления сообщения об ошибке – eatsleepcode

ответ

2

ВМЕСТО триггеров применим только к представлениям.

Логика может быть выполнена с помощью простого

CREATE OR REPLACE TRIGGER BD_INVOICE 
BEFORE DELETE ON INVOICE FOR EACH ROW 
BEGIN 
    IF :OLD.TOTAL >= 100 THEN 
    RAISE_APPLICATION_ERROR(-20001,'Record cannot be deleted.'); 
    END IF; 
END;