Die Syntax wäre:
CREATE TRIGGER tr_total_games
AFTER UPDATE OF game_saved ON game_info
FOR EACH ROW
EXECUTE PROCEDURE total_games();
(Wie im Handbuch dokumentiert.)
Aber der ganze Ansatz ist zweifelhaft. Das Aktualisieren von Aggregaten über Trigger ist bei gleichzeitiger Schreiblast fehleranfällig.
Und ohne gleichzeitige Schreiblast gibt es einfachere Lösungen:addieren / subtrahieren Sie einfach 1 von der aktuellen Summe ...
Ein VIEW
wäre eine zuverlässige Alternative. Entfernen Sie die Spalte game_collection.total_game_count
insgesamt - und vielleicht die ganze Tabelle game_collection
, die keinen anderen Zweck zu haben scheint. Erstellen Sie eine VIEW
stattdessen:
CREATE VIEW v_game_collection AS
SELECT user_id, count(*) AS total_game_count
FROM game_info
WHERE game_saved
GROUP BY user_id;
Dies gibt alle Benutzer mit mindestens 1 Zeile in game_info
zurück wobei game_saved IS TRUE
(und lässt alle anderen weg).
Für sehr große Tabellen möchten Sie vielleicht eine MATERIALIZED VIEW
oder verwandte Lösungen zur Verbesserung der Leseleistung.