sql >> Base de Datos >  >> RDS >> PostgreSQL

Desencadenador de PostgreSQL después de la actualización de una columna específica

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.