Quiero crear un activador en una tabla game_catalog para que cada vez que un usuario agregue o elimine un juego de su colección, se actualice el recuento total de juegos. Dado que la colección de juegos se almacena como una matriz de texto, decidí usar la función array_length para contar la cantidad de juegos.
catálogo_de_juegos
id - BIGSERIAL primary key user_id - INTEGER game_list - text [] game_count - INTEGER Intenté crear un activador para que vuelva a calcular la longitud de la columna game_list después de insertar o eliminar, pero no funciona. Esto es lo que tengo por ahora:
CREATE OR REPLACE FUNCTION count_games() RETURNS TRIGGER AS $$ BEGIN UPDATE game_catalog SET game_count = (SELECT array_length(game_list, 1) from game_catalog) WHERE user_id = NEW.user_id; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER count_games AFTER INSERT OR DELETE ON game_catalog FOR EACH ROW EXECUTE PROCEDURE count_games();Entonces, un par de cosas:
Dicho esto, puede definir su disparador de manera diferente para que funcione:
-- only watch for insert/updates on the game_list column to avoid infinite loop -- delete doesn't matter here CREATE TRIGGER count_games BEFORE INSERT OR UPDATE OF game_list ON game_catalog FOR EACH ROW EXECUTE PROCEDURE count_games();Aunque una vista sería mejor:
CREATE OR REPLACE VIEW game_catalog_count AS SELECT id, user_id, game_list, array_length(game_list,1) as game_count FROM game_catalog;Y su función de activación podría mejorar un poco (a menos que planee hacer referencia a otras filas... pero luego tenga otros problemas en el diseño de su función de activación):
CREATE OR REPLACE FUNCTION count_games() RETURNS TRIGGER AS $$ BEGIN NEW.game_count := array_length(NEW.game_list, 1); RETURN NEW; END; $$ LANGUAGE plpgsql;¡Espero que sea útil!