| | 1 | = Автоматска пресметка на нето износ на трансакција |
| | 2 | |
| | 3 | ==== Опис |
| | 4 | Овој тригер служи за автоматска пресметка и ажурирање на нето износот (`net_amount`) на една трансакција врз основа на сите поврзани записи во табелата `transaction_breakdown` |
| | 5 | |
| | 6 | Нето износот се дефинира како `net_amount = SUM(earned_amount - spent_amount)` |
| | 7 | |
| | 8 | Тригерот се активира секогаш кога ќе се: |
| | 9 | - додаде нов запис |
| | 10 | - ажурира постоечки запис |
| | 11 | - избрише запис |
| | 12 | од табелата `transaction_breakdown` |
| | 13 | |
| | 14 | Со ова се обезбедува конзистентност на податоците, без потреба апликацијата рачно да ја пресметува вредноста |
| | 15 | |
| | 16 | ==== Табели опфатени со тригерот |
| | 17 | - transaction |
| | 18 | - transaction_breakdown |
| | 19 | |
| | 20 | ==== Тип на тригер |
| | 21 | - AFTER INSERT |
| | 22 | - AFTER UPDATE |
| | 23 | - AFTER DELETE |
| | 24 | Активиран над табелата `transaction_breakdown` |
| | 25 | |
| | 26 | ==== SQL Код |
| | 27 | {{{#!sql |
| | 28 | CREATE OR REPLACE FUNCTION update_transaction_net_amount() |
| | 29 | RETURNS TRIGGER |
| | 30 | LANGUAGE plpgsql |
| | 31 | AS $$ |
| | 32 | BEGIN |
| | 33 | UPDATE transaction t |
| | 34 | SET net_amount = ( |
| | 35 | SELECT COALESCE(SUM(tb.earned_amount - tb.spent_amount), 0) |
| | 36 | FROM transaction_breakdown tb |
| | 37 | WHERE tb.transaction_id = t.transaction_id |
| | 38 | ) |
| | 39 | WHERE t.transaction_id = COALESCE(NEW.transaction_id, OLD.transaction_id); |
| | 40 | |
| | 41 | RETURN NULL; |
| | 42 | END; |
| | 43 | $$; |
| | 44 | |
| | 45 | |
| | 46 | CREATE TRIGGER trg_update_transaction_net_amount |
| | 47 | AFTER INSERT OR UPDATE OR DELETE |
| | 48 | ON transaction_breakdown |
| | 49 | FOR EACH ROW |
| | 50 | EXECUTE FUNCTION update_transaction_net_amount(); |
| | 51 | }}} |
| | 52 | |
| | 53 | ==== Објаснување на логиката |
| | 54 | |
| | 55 | При секоја промена во `transaction_breakdown`, тригерот: |
| | 56 | - Го пронаоѓа поврзаниот `transaction_id` |
| | 57 | - Ги сумира сите `earned_amount` и `spent_amount` |
| | 58 | - Ја ажурира колоната `net_amount` во табелата `transaction` |
| | 59 | |
| | 60 | Се користи `COALESCE` за да се избегне `NULL` вредност кога нема breakdown записи |
| | 61 | |
| | 62 | ==== Причина за користење |
| | 63 | Овој тригер е неопходен бидејќи: |
| | 64 | - `net_amount` е деривиран атрибут |
| | 65 | - не смее да зависи од апликативна логика |
| | 66 | |
| | 67 | спречува: |
| | 68 | - неконзистентни податоци |
| | 69 | - човечки грешки |
| | 70 | - дуплирање на бизнис логика |