I have many triggers in my tables, but one behaves not exactly like I want it.
This one counts products and price and returns total price for order - works ok:
CREATE OR REPLACE FUNCTION ustawwartosczamowienia() RETURNS TRIGGER AS $$
DECLARE
przed NUMERIC;
po NUMERIC;
ile NUMERIC;
BEGIN
IF (TG_OP = 'INSERT') OR (TG_OP = 'UPDATE') THEN
SELECT cena*zamowienieilosc INTO ile FROM zamowienie_zawiera INNER JOIN zamowienie on zamowienie.id=zamowienie_idzamowienie inner join egzemplarz on zamowienie_zawiera.egzemplarz_idegzemplarz=egzemplarz.id inner join produkt on egzemplarz.produkt_idprodukt = produkt.id WHERE zamowienieilosc = new.zamowienieilosc;
SELECT wartosczamowienia INTO przed FROM zamowienie WHERE zamowienie.id = new.zamowienie_idzamowienie;
po := przed+ile;
UPDATE zamowienie SET wartosczamowienia=po WHERE zamowienie.id = new.zamowienie_idzamowienie;
ELSE
RAISE NOTICE 'Nie ma czegoś takiego';
END IF;
RETURN NEW;
END
$$
LANGUAGE 'plpgsql';
CREATE TRIGGER zamowieniewartosc
AFTER INSERT OR UPDATE
ON zamowienie_zawiera
FOR EACH ROW
EXECUTE PROCEDURE ustawwartosczamowienia();
And then I see that somebody purchased goods for f.e. 1024 totally. So I want add this money to this one's personal account to give them special offers for loyal customers later. I wrote similar trigger:
CREATE OR REPLACE FUNCTION kontododaj() RETURNS TRIGGER AS $$
DECLARE
przed NUMERIC;
po NUMERIC;
ile NUMERIC;
klient_idklient RECORD;
BEGIN
IF (TG_OP = 'INSERT') OR (TG_OP = 'UPDATE') THEN
SELECT sumazamowien INTO przed FROM klient WHERE klient.id = new.klient_idklient;
SELECT wartosczamowienia INTO ile FROM zamowienie WHERE wartosczamowienia = new.wartosczamowienia;
po := przed + ile;
UPDATE klient SET sumazamowien=po WHERE klient.id = new.klient_idklient;
ELSE
RAISE NOTICE 'Nie ma czegoś takiego';
END IF;
RETURN NEW;
END
$$
LANGUAGE 'plpgsql';
CREATE TRIGGER kontoplus
AFTER INSERT OR UPDATE
ON zamowienie
FOR EACH ROW
EXECUTE PROCEDURE kontododaj();
Then I look at somebody's account and they have 2048 instead 1024. My trigger adds money twice. What should I change?