我的表中有很多触发器,但其中一个的行为并不完全符合我的要求。
这个计算产品和价格并返回订单总价 - 工作正常:
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();
然后我看到有人以 fe 1024 的价格购买了商品。所以我想把这笔钱添加到这个人的个人账户中,以便以后为他们的忠实客户提供特别优惠。我写了类似的触发器:
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();
然后我查看某人的帐户,他们有 2048 而不是 1024。我的触发器添加了两次钱。我应该改变什么?