2016-04-05 12 views
-1

SQLデータベースのトリガーをいくつか作成しています。私は正常にINSERTとSYSDATEを比較する2つのトリガを作成しました。この3番目の場合は、挿入された値が10より大きくないことを確認しようとしています。以下はトリガーとそれを実行するテストデータです。私はその問題が価値評価を宣言することと関係していると信じています。数値変数を使用したSQLトリガーの作成

CREATE OR REPLACE TRIGGER trig_rating_ck 
BEFORE INSERT OR UPDATE OF rating ON reviews 
FOR EACH ROW 

BEGIN 
IF (NEW.rating > 10) THEN 
RAISE_APPLICATION_ERROR(-20000, 'Rating has to be between 1 and 10'); 
END IF; 
END trig_rating_ck; 
/

--TEST DATA 
INSERT INTO reviews (review_id, reviewer_id, venue_id, description, rating, date_posted) 
VALUES (seq_reviews.NEXTVAL, 10000,10000, 'THIS WAS GREAT', '11', '06-APR-2016'); 
+1

エラーは何ですか? – bassrek

+2

'if(:new.rating> 10)'に 'new'の前にコロンを置く必要があるので、トリガーを作成するときにエラーが発生すると思います。日付リテラルまたは明示的な 'to_date'を使用するのではなく、日付列に文字列を挿入しようとしているため、' insert'文を実行する際にエラーが発生する可能性があります。 –

答えて

4

トリガーではなく、このような宣言的な制約を使用する必要があります。私は数年後にOracleと仕事をしませんでしたが、SQL Serverトリガではパフォーマンスに大きな影響を与えることがあります。ちょうどあなたのテーブルの宣言の一部となる

CONSTRAINT CHK_Reviews_rating CHECK (rating BETWEEN 0 AND 10) 

:あなたは、単に使用することができ、この特定のケースでは

トリガーはまた、隠されたビジネスロジックを引き起こす可能性がありますが、これは悪い考えです。

これらの状況でエラーをカスタマイズできるかどうかわかりませんが、アプリケーションでエラーを見て適切に処理できるはずです。

関連する問題