| | 1 | = Превенција на бришење на акаунти со историја |
| | 2 | |
| | 3 | ==== Опис |
| | 4 | Овој тригер спречува бришење на трансакциска сметка доколку таа има поврзани записи во табелата `transaction_breakdown` |
| | 5 | |
| | 6 | Со ова се заштитува финансиската историја и се спречува губење на важни податоци |
| | 7 | |
| | 8 | ==== Табели опфатени со тригерот |
| | 9 | - `transaction_account` |
| | 10 | - `transaction_breakdown` |
| | 11 | |
| | 12 | ==== Тип на тригер |
| | 13 | - **BEFORE DELETE |
| | 14 | Активиран над табелата `transaction_account` |
| | 15 | |
| | 16 | ==== SQL код |
| | 17 | {{{#!sql |
| | 18 | CREATE OR REPLACE FUNCTION prevent_account_delete_with_history() |
| | 19 | RETURNS TRIGGER |
| | 20 | LANGUAGE plpgsql |
| | 21 | AS $$ |
| | 22 | BEGIN |
| | 23 | IF EXISTS ( |
| | 24 | SELECT 1 |
| | 25 | FROM transaction_breakdown |
| | 26 | WHERE transaction_account_id = OLD.transaction_account_id |
| | 27 | ) THEN |
| | 28 | RAISE EXCEPTION |
| | 29 | 'The transaction account cannot be deleted because it contains history of transactions, delete them first!'; |
| | 30 | END IF; |
| | 31 | |
| | 32 | RETURN OLD; |
| | 33 | END; |
| | 34 | $$; |
| | 35 | |
| | 36 | |
| | 37 | CREATE TRIGGER trg_prevent_account_delete_with_history |
| | 38 | BEFORE DELETE |
| | 39 | ON transaction_account |
| | 40 | FOR EACH ROW |
| | 41 | EXECUTE FUNCTION prevent_account_delete_with_history(); |
| | 42 | }}} |
| | 43 | |
| | 44 | ==== Објаснување на логиката |
| | 45 | Пред бришење на сметката: |
| | 46 | - се проверува дали постојат поврзани breakdown записи |
| | 47 | Доколку постојат: |
| | 48 | - бришењето се прекинува |
| | 49 | - се прикажува соодветна грешка |
| | 50 | Ова обезбедува зачувување на историските податоци |
| | 51 | |
| | 52 | ==== Причина за користење |
| | 53 | Овој тригер е важен бидејќи: |
| | 54 | - финансиските податоци не смеат да се губат |
| | 55 | - бришење на сметка може да доведе до неконзистентни извештаи, сите извештаи остануваат точни и доверливи |
| | 56 | - `ON DELETE CASCADE` не е соодветен за ваков случај: |
| | 57 | `ON DELETE CASCADE` автоматски ги брише сите поврзани записи во зависните табели кога ќе се избрише родителскиот запис |
| | 58 | |
| | 59 | Иако ова е корисно во одредени сценарија, во финансиски системи како FEiN тоа претставува сериозен ризик за губење на финансиската историја, која никогаш не смее автоматски да се избрише |
| | 60 | |
| | 61 | Сметката можеби повеќе не е активна, но историјата останува, а `ON DELETE CASCADE` имплицира дека: |
| | 62 | - ако сметката не постои → трансакциите не постоеле, што е бизнис логички неточно |