0
CREATE OR REPLACE trigger million_trigger
BEFORE INSERT or UPDATE on employee
FOR EACH ROW
WHEN (new.SALARY>1000000)

DECLARE
txt EXCEPTION;

BEGIN
if INSERTING or UPDATING then 

    RAISE txt ;

end if;

EXCEPTION
    WHEN txt THEN
        DBMS_OUTPUT.PUT_LINE('SALARY TOO HIGH');
end;
/

こんにちは、テーブル従業員からの給与が 1,000,000 より大きいかどうかをチェックするトリガーを作成しました。給与が高い場合、トリガーは、ストアド プロシージャからの挿入ステートメントの実行を停止することになっています。トリガーは正常に作成されましたが、給与が 1,000,000 を超えるレコードを挿入しても何も起こりません。(レコードが挿入されます - これは起こるべきではありません) 何か考えはありますか?

4

1 に答える 1

3

トリガーがエラーをスローしないように、例外をキャッチしています。トリガーはエラーをスローしないため、INSERTステートメントは続行され、最終的には成功します。セッションで有効にした場合、「給与が高すぎます」というメッセージが表示されますが、バッファに書き込まれたデータが誰かによって読み取られているserveroutputことに依存しないでください。dbms_output

ステートメントの実行を停止する場合はINSERT、例外ハンドラーを削除する必要があります。ほとんどの場合、例外の発生方法も変更する必要があります

IF( :new.salary > 1000000 )
THEN
  RAISE_APPLICATION_ERROR( -20001, 'Salary too high' );
END IF;
于 2013-10-06T01:13:06.557 に答える