Jak ustawić prawidłowo dwa triggery na jednej tabeli ?

0

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ć ?

0

Statystyki też inaczej może updateować. Przy dużej bazie to rozwiązanie z count() nie będzie raczej zbyt wydajne... :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1