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