テーブルに多くのトリガーがありますが、意図したとおりに動作しないトリガーが 1 つあります。
これは製品と価格をカウントし、注文の合計価格を返します-正常に動作します:
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();
そして、誰かが完全に 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();
次に、誰かの口座を確認すると、1024 ではなく 2048 になっています。私のトリガーは、お金を 2 回追加します。何を変更すればよいですか?