La sintaxis sería:
CREATE TRIGGER tr_total_games
AFTER UPDATE OF game_saved ON game_info
FOR EACH ROW
EXECUTE PROCEDURE total_games();
(Como se documenta en el manual).
Pero todo el enfoque es dudoso. Mantener los agregados actualizados a través del disparador es propenso a errores bajo una carga de escritura simultánea.
Y sin carga de escritura concurrente, hay soluciones más simples:simplemente agregue/reste 1 del total actual...
Un VIEW
sería una alternativa confiable. Elimina la columna game_collection.total_game_count
en total - y tal vez toda la tabla game_collection
, que no parece tener otro propósito. Crear una VIEW
en cambio:
CREATE VIEW v_game_collection AS
SELECT user_id, count(*) AS total_game_count
FROM game_info
WHERE game_saved
GROUP BY user_id;
Esto devuelve todos los usuarios con al menos 1 fila en game_info
donde game_saved IS TRUE
(y omite todos los demás).
Para tablas muy grandes, es posible que desee una MATERIALIZED VIEW
o soluciones relacionadas para mejorar el rendimiento de lectura.