sql >> データベース >  >> RDS >> Oracle

挿入トリガーの防止

    会議でプレゼンテーションを行った後、PL/SQLを教えている大学の講師とおしゃべりをしました。私の話はPL/SQLのグッドプラクティスについてでした。私のスライドの1つは、単に「トリガーを使用しないでください」と言っていました。講師は、そのようなアドバイスをカリキュラムのニーズと調和させるのは難しいと私に言った。彼らは生徒にすべての構文を教える必要がありますが、ソフトウェアを専門的に作成するときに使用しないソリューションを必要とするタスクを設定することがよくあることを彼は認めました。

    これはそのような質問です。正しいアプローチは、ゴードンの答えが示すように チェック制約を使用することです。 。制約はより効率的で、慣用的でもあります。しかし、先生はあなたにトリガーを書いてほしいと言っているので、ここにあなたのコードが修正されています。

    CREATE OR REPLACE TRIGGER CheckAdvance
        BEFORE INSERT OR UPDATE OF advance ON titles
        FOR EACH ROW
    BEGIN
        IF (:new.advance < 0  
             OR :new.advance > 100)
        THEN
            raise_application_error(-20000
                    , 'Advance cannot be less than zero or greater than one hundred.');
        END IF;
    END;
    

    注意点:

    1. CREATE OR REPLACEは、予備のDROPステートメントなしでトリガーコードを変更できることを意味します。
    2. トリガー本体などのコードのBEGINおよびENDフレームブロック。
    3. 静的条件文はIF...ENDIFキーワードで囲まれています。 WHENは、ループ構造を終了するためのものです。
    4. :NEW(および:OLD)キーワードを使用してテーブルの列の値を参照します-コロンに注意してください。
    5. RAISE_APPLICATION_ERRORを使用して例外をスローします。エラー番号は、Oracleがユーザー定義の例外用に予約している-20999〜-20000の範囲内である必要があります。
    6. エラーメッセージを意味のあるものにする:ユーザーに推測させるのではなく、何が間違っていたかをユーザーに伝えます。
    7. インデントを使用してコードを読みやすくする方法を学びます。あなたの将来の同僚はそれをあなたに感謝するでしょう。


    1. OracleDBの毎日のパーティショニング

    2. 列が多すぎるテーブルのデメリット

    3. 今日、今週、今月のphpmysqlからレコードを選択します

    4. SQLクエリから変数を設定するにはどうすればよいですか?