2017-05-30 12 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; 

コードへの爆発:id_statusが1または2の場合は、挿入をしないことをおすすめします。

これは私が書いたトリガーです。条件が真であれば、挿入後にレコードを削除します(私はそれをテストしませんでした)。

挿入する前にそれを防ぐ方法はありますか?

私は '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

@Matthewこれはエラーコードの例です。この記事では、「RAISE_APPLICATION_ERRORプロシージャ」セクションのhttps://docs.oracle.com/cloud/latest/db112/LNPLS/errors.htm#LNPLS99960に関する詳細情報を示します。私はそれを完全に無作為なものに編集しました。 :-) – Tenzin

4

これを行うには、トリガーが間違った方法です。その代わり、check制約を使用します。

alter table Rent add constraint chk_id_status check (id_status not in (1, 2)); 
関連する問題