Запускать триггер после транзакции, а не в каждой строке - PostgreSQL 9.4
У меня есть этот триггер, чтобы гарантировать, что общая сумма всех голосов не проходит 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();
Следует отметить, что «голосование» может быть обновлено, так что это не только ВСТАВКА. Вот где возникает моя проблема, так как один пользователь может изменить количество голосов между автомобилями, а затем триггер будет выпущен, поскольку обновление в одной строке может превысить ограничение в 100, а другие обновления уменьшат другие голоса.
Я надеюсь, что это имеет смысл.
Мне бы хотелось, чтобы триггер назывался AFTER a BEGIN ... COMMIT, поэтому я могу обновить несколько строк, прежде чем проверять, все ли в порядке, - но также вызвать исключение и не сохранять результат, если пользователь пытается обновить голоса более чем на 100.