A sintaxe seria:
CREATE TRIGGER tr_total_games
AFTER UPDATE OF game_saved ON game_info
FOR EACH ROW
EXECUTE PROCEDURE total_games();
(conforme documentado no manual.)
Mas toda a abordagem é duvidosa. Manter os agregados atualizados por meio do gatilho está sujeito a erros sob carga de gravação simultânea.
E sem carga de escrita simultânea, existem soluções mais simples:basta somar/subtrair 1 do total atual...
Uma
VIEW
seria uma alternativa confiável. Remova a coluna game_collection.total_game_count
completamente - e talvez toda a tabela game_collection
, que não parece ter outro propósito. Crie uma VIEW
em vez de:CREATE VIEW v_game_collection AS
SELECT user_id, count(*) AS total_game_count
FROM game_info
WHERE game_saved
GROUP BY user_id;
Isso retorna todos os usuários com pelo menos 1 linha em
game_info
onde game_saved IS TRUE
(e omite todos os outros). Para tabelas muito grandes, você pode querer uma
MATERIALIZED VIEW
ou soluções relacionadas para melhorar o desempenho de leitura.