2016-11-28 155 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;