2016-11-28 16 views
0

入力値が一定量を超えたときに行の削除を制限するために、「削除の代わりに」トリガーを作成したいとします。請求書(InvoiceID数、総数)削除トリガーの代わりにOracle SQL

は私が合計で> = 100に格納された値を持つ行を削除して予防しようとすると、トリガーが起動します:

は、私は2列の請求書テーブルを持っています削除。

これまでのところ、私は欲しいものを大まかに説明しましたが、正確な構文が正しいかどうかはわかりません。私が代わりにトリガを考え

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; 

は、テーブルの上に使用することができますが、私は、次のエラーメッセージが表示されます。

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を使っているときに、Mrさんは何を言っていますか? –

+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; 
関連する問題