Executar gatilho após transação, não em cada linha - PostgreSQL 9.4
Eu tenho esse gatilho para garantir que a soma total de todos os votos não ultrapasse 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();
Deve-se mencionar que um "voto" pode ser atualizado, portanto, não são apenas INSERTs. É aqui que ocorre o meu problema, pois um usuário pode alterar os votos entre os carros e, em seguida, o gatilho é emitido, pois uma atualização em uma única linha pode exceder o limite de 100, antes que as outras atualizações diminuam os outros votos.
Espero que faça sentido.
Gostaria que o gatilho fosse chamado APÓS um COMEÇO ... COMPROMETIMENTO, para que eu possa atualizar várias linhas antes de verificar se tudo está em ordem - mas também crie uma exceção e não salve o resultado se um usuário tentar atualizar os votos para mais de 100