Wytłumaczę najprościej jak mi się uda heh. Jest tabela z gry ze statystyką Usera. Ma on energie i pole is_alive. Wiadomo, energia no to pokazuje stan zdrowia, a is_alive określa czy user jeszcze żyje. Teraz z tej tabeli pobieram ile userów żyje a ile nie. Jeżeli user osiągnie energie =< 0 to trigger przestawia mu is_alive na FALSE
CREATE OR REPLACE FUNCTION trg_users_stats_insup_bef()
RETURNS trigger AS
$func$
BEGIN
IF NEW.energy <= 0 THEN
NEW.is_alive := FALSE;
END IF;
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER insup_bef
BEFORE INSERT OR UPDATE OF energy ON users_stats
FOR EACH ROW
EXECUTE PROCEDURE trg_users_stats_insup_bef();
Drugi trigger zrobiłęm taki że jeżeli przestawi się pole is_alive na FALSE to ma aktualizować tabele ze statystykami ilu żywych ilu martwych. I wygląda on tak:
CREATE OR REPLACE FUNCTION trg_update_users_stats_insup_aft()
RETURNS trigger AS
$func$
BEGIN
UPDATE game_statistics
SET
total_users = (select count(id) from users_stats),
dead_users = (select count(id) from users_stats where is_alive = false),
alive_users = (select count(id) from users_stats where is_alive = true);
RETURN NEW;
END
$func$ LANGUAGE plpgsql;
CREATE TRIGGER insup_aft
AFTER INSERT OR UPDATE OF is_alive ON users_stats -- covers INSERT, too
FOR EACH ROW
EXECUTE PROCEDURE trg_update_users_stats_insup_aft();
Jeżeli teraz zrobię na bazie UPDATE users_stats SET is_alive = FALSE to trigger aktualizuje tabele ze statystykami userow i pokazuje ilu martywch ilu nie. Natomiast jak zrobie UPDATE uses_stats SET energy = -2 to triger tylko zmienia is_alive na FALSE ale juz nie aktualizuje tej tabeli ze statysykami. Ma ktoś pomysł jak to zrobić ?