La syntaxe serait :
CREATE TRIGGER tr_total_games
AFTER UPDATE OF game_saved ON game_info
FOR EACH ROW
EXECUTE PROCEDURE total_games();
(Comme documenté dans le manuel.)
Mais toute l'approche est douteuse. La mise à jour des agrégats via le déclencheur est sujette à des erreurs en cas de charge d'écriture simultanée.
Et sans charge d'écriture simultanée, il existe des solutions plus simples :il suffit d'ajouter/soustraire 1 au total actuel...
Une VIEW
serait une alternative fiable. Supprimez la colonne game_collection.total_game_count
tout à fait - et peut-être toute la table game_collection
, qui ne semble pas avoir d'autre but. Créer une VIEW
à la place :
CREATE VIEW v_game_collection AS
SELECT user_id, count(*) AS total_game_count
FROM game_info
WHERE game_saved
GROUP BY user_id;
Cela renvoie tous les utilisateurs avec au moins 1 ligne dans game_info
où game_saved IS TRUE
(et omet tous les autres).
Pour les très grandes tables, vous voudrez peut-être une MATERIALIZED VIEW
ou des solutions connexes pour améliorer les performances de lecture.