2016-11-28 258 views
0

我想创建一个'而不是删除'触发器来限制当输入的值超过一定数量时删除一行。Oracle SQL而不是删除触发器

我有2列的发票表:发票(InvoiceID数,总数)

我想触发器触发,如果我尝试删除在总拥有储值> = 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; 

我想到的INSTEAD OF触发器可以在表上使用,但我得到了以下错误消息:

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

来完成“但我不知道确切的语法是正确的。” DB先生在一个虚拟DB中进行测试时会说什么? –

+0

@MitchWheat感谢提醒我。更新以添加错误消息 – eatsleepcode

回答

2

INSTEAD OF触发器只适用于意见。

逻辑可以通过简单的

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;