Changes between Initial Version and Version 1 of Trigger1


Ignore:
Timestamp:
01/02/26 01:17:27 (31 hours ago)
Author:
211101
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Trigger1

    v1 v1  
     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
     28CREATE OR REPLACE FUNCTION update_transaction_net_amount()
     29RETURNS TRIGGER
     30LANGUAGE plpgsql
     31AS $$
     32BEGIN
     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;
     42END;
     43$$;
     44
     45
     46CREATE TRIGGER trg_update_transaction_net_amount
     47AFTER INSERT OR UPDATE OR DELETE
     48ON transaction_breakdown
     49FOR EACH ROW
     50EXECUTE 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- дуплирање на бизнис логика