2017-05-30 8 views
0

Ich muss Trigger in PL/SQL schreiben. Ich möchte, dass die Einfügung verhindert wird, wenn die Bedingung wahr ist.PL/SQL-Trigger zum Einfügen zu verhindern

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; 

Explonation zu dem Code: Wenn id_status gleich 1 oder 2 ist, möchte ich Einfügen nicht getan werden.

Dies ist der Auslöser, den ich geschrieben habe. Es löscht (ich vermute, ich habe es nicht getestet) den Datensatz nach dem Einfügen, wenn die Bedingung wahr ist.

Gibt es eine Möglichkeit, es vor dem Einfügen zu verhindern?

Ich dachte über steigende Ausnahme in 'vor dem Einführen' Typ Trigger, ist es eine gute Lösung?

PS: Es muss Trigger sein, ich weiß, dass es als Check Constraints implementiert werden kann.

Antwort

1

Ich denke, Sie sollten einen BEFORE INSERT-Trigger verwenden.
Und vielleicht ein Raise_Application_Error() verwenden.
Zum Beispiel:

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

du hast Recht mit dem Raise_application, nur ein Nebenbei bemerkt, können Sie es mit vor Feuer, oder nach dem Einsatz. Funktioniert in beiden Richtungen. –

+0

Woher hast du '-20343'? –

+0

@ Matthew Das ist ein Beispiel Fehlercode. Dieser Artikel zeigt weitere Informationen dazu: https://docs.oracle.com/cloud/latest/db112/LNPLS/errors.htm#LNPLS99960, unter dem Abschnitt 'RAISE_APPLICATION_ERROR Procedure'. Ich habe es zu etwas weniger Random bearbeitet. :-) – Tenzin

4

Ein Trigger ist der falsche Weg, dies zu tun. Verwenden Sie stattdessen eine check Einschränkung:

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