使用数字变量创建SQL触发器

时间:2016-04-05 13:17:11

标签: sql oracle triggers

我正在为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');

1 个答案:

答案 0 :(得分:4)

你应该使用声明式约束来做这样的事情而不是触发器。我在几年内没有与Oracle合作,但在SQL Server触发器中可能会产生很大的性能影响,更不用说更有可能导致错误或让事情漏掉。

对于这种特殊情况,您可以使用:

CONSTRAINT CHK_Reviews_rating CHECK (rating BETWEEN 0 AND 10)

这只是你的表声明的一部分。

触发器也可能导致隐藏的业务逻辑,这是一个坏主意。

我不知道您是否可以在这些情况下自定义错误,但您的应用程序应该能够看到错误并正确处理错误。