Автоматска пресметка на нето износ на трансакција
Опис
Овој тригер служи за автоматска пресметка и ажурирање на нето износот (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е деривиран атрибут- не смее да зависи од апликативна логика
спречува:
- неконзистентни податоци
- човечки грешки
- дуплирање на бизнис логика
