= Превенција на бришење на акаунти со историја ==== Опис Овој тригер спречува бришење на трансакциска сметка доколку таа има поврзани записи во табелата `transaction_breakdown` Со ова се заштитува финансиската историја и се спречува губење на важни податоци ==== Табели опфатени со тригерот - `transaction_account` - `transaction_breakdown` ==== Тип на тригер - **BEFORE DELETE Активиран над табелата `transaction_account` ==== SQL код {{{#!sql CREATE OR REPLACE FUNCTION prevent_account_delete_with_history() RETURNS TRIGGER LANGUAGE plpgsql AS $$ BEGIN IF EXISTS ( SELECT 1 FROM transaction_breakdown WHERE transaction_account_id = OLD.transaction_account_id ) THEN RAISE EXCEPTION 'The transaction account cannot be deleted because it contains history of transactions, delete them first!'; END IF; RETURN OLD; END; $$; CREATE TRIGGER trg_prevent_account_delete_with_history BEFORE DELETE ON transaction_account FOR EACH ROW EXECUTE FUNCTION prevent_account_delete_with_history(); }}} ==== Објаснување на логиката Пред бришење на сметката: - се проверува дали постојат поврзани breakdown записи Доколку постојат: - бришењето се прекинува - се прикажува соодветна грешка Ова обезбедува зачувување на историските податоци ==== Причина за користење Овој тригер е важен бидејќи: - финансиските податоци не смеат да се губат - бришење на сметка може да доведе до неконзистентни извештаи, сите извештаи остануваат точни и доверливи - `ON DELETE CASCADE` не е соодветен за ваков случај: `ON DELETE CASCADE` автоматски ги брише сите поврзани записи во зависните табели кога ќе се избрише родителскиот запис Иако ова е корисно во одредени сценарија, во финансиски системи како FEiN тоа претставува сериозен ризик за губење на финансиската историја, која никогаш не смее автоматски да се избрише Сметката можеби повеќе не е активна, но историјата останува, а `ON DELETE CASCADE` имплицира дека: - ако сметката не постои → трансакциите не постоеле, што е бизнис логички неточно