【发布时间】:2016-09-13 14:58:24
【问题描述】:
我有这个触发器来确保所有投票的总和不超过100:
CREATE FUNCTION limit_votes() RETURNS TRIGGER AS $limit_votes$
DECLARE
votes_total int;
BEGIN
votes_total := NEW.vote + (SELECT SUM(vote) FROM cars WHERE portfolio_id = NEW.portfolio_id AND car != NEW.car);
IF votes_total > 100 THEN
RAISE EXCEPTION 'votes_limit_exceeded';
END IF;
RETURN NEW;
END;
$limit_votes$ LANGUAGE plpgsql;
CREATE TRIGGER limit_votes BEFORE INSERT OR UPDATE ON cars FOR EACH ROW EXECUTE PROCEDURE limit_votes();
应该提到“投票”是可以更新的,所以它不仅仅是 INSERT。 这就是我的问题发生的地方,因为一个用户可以更改汽车之间的投票,然后在其他更新减少其他投票之前,触发单行的更新可能会超过 100 的限制。
我希望它有意义。
我希望在 BEGIN ... COMMIT 之后调用触发器,因此我可以在检查一切正常之前更新多行 - 但如果用户尝试更新投票,也会引发异常并且不保存结果超过 100 个。
【问题讨论】:
标签: postgresql