| Version 1 (modified by , 2 days ago) ( diff ) |
|---|
Превенција на бришење на акаунти со историја
Опис
Овој тригер спречува бришење на трансакциска сметка доколку таа има поврзани записи во табелата transaction_breakdown
Со ова се заштитува финансиската историја и се спречува губење на важни податоци
Табели опфатени со тригерот
transaction_accounttransaction_breakdown
Тип на тригер
- BEFORE DELETE
Активиран над табелата transaction_account
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 имплицира дека:
- ако сметката не постои → трансакциите не постоеле, што е бизнис логички неточно
