wiki:Trigger1

Version 1 (modified by 211101, 28 hours ago) ( diff )

--

Автоматска пресметка на нето износ на трансакција

Опис

Овој тригер служи за автоматска пресметка и ажурирање на нето износот (net_amount) на една трансакција врз основа на сите поврзани записи во табелата transaction_breakdown

Нето износот се дефинира како net_amount = SUM(earned_amount - spent_amount)

Тригерот се активира секогаш кога ќе се:

  • додаде нов запис
  • ажурира постоечки запис
  • избрише запис

од табелата transaction_breakdown

Со ова се обезбедува конзистентност на податоците, без потреба апликацијата рачно да ја пресметува вредноста

Табели опфатени со тригерот

  • transaction
  • transaction_breakdown

Тип на тригер

  • AFTER INSERT
  • AFTER UPDATE
  • AFTER DELETE

Активиран над табелата transaction_breakdown

SQL Код

CREATE OR REPLACE FUNCTION update_transaction_net_amount()
RETURNS TRIGGER
LANGUAGE plpgsql
AS $$
BEGIN
    UPDATE transaction t
    SET net_amount = (
        SELECT COALESCE(SUM(tb.earned_amount - tb.spent_amount), 0)
        FROM transaction_breakdown tb
        WHERE tb.transaction_id = t.transaction_id
    )
    WHERE t.transaction_id = COALESCE(NEW.transaction_id, OLD.transaction_id);

    RETURN NULL;
END;
$$;


CREATE TRIGGER trg_update_transaction_net_amount
AFTER INSERT OR UPDATE OR DELETE
ON transaction_breakdown
FOR EACH ROW
EXECUTE FUNCTION update_transaction_net_amount();

Објаснување на логиката

При секоја промена во transaction_breakdown, тригерот:

  • Го пронаоѓа поврзаниот transaction_id
  • Ги сумира сите earned_amount и spent_amount
  • Ја ажурира колоната net_amount во табелата transaction

Се користи COALESCE за да се избегне NULL вредност кога нема breakdown записи

Причина за користење

Овој тригер е неопходен бидејќи:

  • net_amount е деривиран атрибут
  • не смее да зависи од апликативна логика

спречува:

  • неконзистентни податоци
  • човечки грешки
  • дуплирање на бизнис логика
Note: See TracWiki for help on using the wiki.