= Автоматска пресметка на нето износ на трансакција ==== Опис Овој тригер служи за автоматска пресметка и ажурирање на нето износот (`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 $$ DECLARE v_transaction_id INT; BEGIN IF TG_OP = 'DELETE' THEN v_transaction_id := OLD.transaction_id; ELSE v_transaction_id := NEW.transaction_id; END IF; UPDATE "transaction" t SET net_amount = ( SELECT COALESCE(SUM( COALESCE(tb.earned_amount, 0) - COALESCE(tb.spent_amount, 0) ), 0) FROM transaction_breakdown tb WHERE tb.transaction_id = t.transaction_id ) WHERE t.transaction_id = v_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` е деривиран атрибут - не смее да зависи од апликативна логика спречува: - неконзистентни податоци - човечки грешки - дуплирање на бизнис логика