2017-05-30 135 views
0

我需要在PL/SQL中編寫觸發器。當條件爲真時,我想要阻止插入。PL/SQL觸發器,以防止插入

CREATE OR REPLACE TRIGGER SafeRent AFTER INSERT ON Rent 
FOR EACH ROW 
DECLARE 
BEGIN 
    IF :NEW.id_status IN (1,2) THEN 
     DELETE FROM Rent WHERE id_rent = :NEW.id_rent; 
    END IF; 
END; 

Expationation to the code:if id_status equals 1 or 2我想要插入NOT。

這是我寫的觸發器。如果條件爲真,它會刪除(我想是的,我沒有測試過)插入後的記錄。

有什麼辦法可以在插入前預防它嗎?

我正在考慮在'BEFORE INSERT'類型觸發器中上升的異常,這是一個很好的解決方案嗎?

PS:它必須是觸發器,我知道它可以實現爲檢查約束。

回答

1

我認爲你應該使用一個BEFORE INSERT觸發。
也許可以使用Raise_Application_Error()
例如:

CREATE OR REPLACE TRIGGER HelloWorld 
BEFORE INSERT ON TableA 
FOR EACH ROW 
BEGIN 
     IF :NEW.id_status IN (1,2) THEN 
       Raise_Application_Error (-20100, 'Something to post when raising error.'); 
     END IF; 
END; 
/
+0

你說得對與Raise_application,只是阿里納斯,你可以用之前進行發射,或插入後。雙向工作。 –

+0

你從哪裏得到'-20343'? –

+0

@Mthethew這是一個示例錯誤代碼。本文向您展示有關該更多信息:https://docs.oracle.com/cloud/latest/db112/LNPLS/errors.htm#LNPLS99960,位於「RAISE_APPLICATION_ERROR過程」一節下。我將它編輯爲一些不太完整的randdom。 :-) – Tenzin

4

觸發器是這樣做的錯誤方法。相反,使用check約束:

alter table Rent add constraint chk_id_status check (id_status not in (1, 2));