La sintassi sarebbe:
CREATE TRIGGER tr_total_games
AFTER UPDATE OF game_saved ON game_info
FOR EACH ROW
EXECUTE PROCEDURE total_games();
(Come documentato nel manuale.)
Ma l'intero approccio è dubbio. Mantenere aggiornati gli aggregati tramite trigger è soggetto a errori in caso di carico di scrittura simultaneo.
E senza carico di scrittura simultaneo, ci sono soluzioni più semplici:basta aggiungere/sottrarre 1 dal totale corrente...
Un VIEW
sarebbe un'alternativa affidabile Rimuovi la colonna game_collection.total_game_count
del tutto - e forse l'intero tavolo game_collection
, che non sembra avere altro scopo. Crea una VIEW
invece:
CREATE VIEW v_game_collection AS
SELECT user_id, count(*) AS total_game_count
FROM game_info
WHERE game_saved
GROUP BY user_id;
Questo restituisce tutti gli utenti con almeno 1 riga in game_info
dove game_saved IS TRUE
(e omette tutti gli altri).
Per tavoli molto grandi potresti volere una MATERIALIZED VIEW
o soluzioni correlate per migliorare le prestazioni di lettura.