我正在为SQL数据库创建一些触发器。我成功地制作了两个触发器,用于比较INSERT和SYSDATE。对于第三个,我正在尝试确保插入的值不大于10.下面是触发器和运行它的测试数据。我认为这个问题与声明价值评级有关。
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');
答案 0 :(得分:4)
你应该使用声明式约束来做这样的事情而不是触发器。我在几年内没有与Oracle合作,但在SQL Server触发器中可能会产生很大的性能影响,更不用说更有可能导致错误或让事情漏掉。
对于这种特殊情况,您可以使用:
CONSTRAINT CHK_Reviews_rating CHECK (rating BETWEEN 0 AND 10)
这只是你的表声明的一部分。
触发器也可能导致隐藏的业务逻辑,这是一个坏主意。
我不知道您是否可以在这些情况下自定义错误,但您的应用程序应该能够看到错误并正确处理错误。