PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

PostgreSQL Trigger após atualização de uma coluna específica


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.