| 25 | |
| 26 | ** Примери за тригери ** |
| 27 | |
| 28 | 1. Проверка на датумска логика |
| 29 | {{{#!sql |
| 30 | |
| 31 | CREATE OR REPLACE FUNCTION project.validate_policy_dates() |
| 32 | RETURNS TRIGGER AS $$ |
| 33 | BEGIN |
| 34 | IF NEW.edate <= NEW.sdate THEN |
| 35 | RAISE EXCEPTION 'End date must be after start date. Start: %, End: %', NEW.sdate, NEW.edate; |
| 36 | END IF; |
| 37 | RETURN NEW; |
| 38 | END; |
| 39 | $$ LANGUAGE plpgsql; |
| 40 | |
| 41 | CREATE TRIGGER trigger_validate_policy_dates |
| 42 | BEFORE INSERT OR UPDATE ON project.policy |
| 43 | FOR EACH ROW EXECUTE FUNCTION project.validate_policy_dates(); |
| 44 | |
| 45 | }}} |
| 46 | |
| 47 | |
| 48 | 2. Да спречи внесување на плаќање (Payment) кое е поголемо од осигурената вредност |
| 49 | {{{#!sql |
| 50 | |
| 51 | CREATE OR REPLACE FUNCTION project.validate_payment_amount() |
| 52 | RETURNS TRIGGER AS $$ |
| 53 | DECLARE |
| 54 | max_amount NUMERIC; |
| 55 | BEGIN |
| 56 | -- земи ја максималната дозволена вредност од пакетот |
| 57 | SELECT pkg.total INTO max_amount |
| 58 | FROM project.policy pol |
| 59 | JOIN project.package pkg ON pol.package = pkg.code |
| 60 | WHERE pol.p_id = NEW.policy; |
| 61 | |
| 62 | -- ако не постои поврзана полиса или пакет, кревај грешка |
| 63 | IF max_amount IS NULL THEN |
| 64 | RAISE EXCEPTION 'Cannot validate payment. No associated policy/package found for policy ID: %', NEW.policy; |
| 65 | END IF; |
| 66 | |
| 67 | -- ако износот на плаќање е поголем од дозволениот, кревај грешка |
| 68 | IF NEW.p_amount > max_amount THEN |
| 69 | RAISE EXCEPTION 'Payment amount (%.2f) exceeds maximum allowed (%.2f) for policy %', NEW.p_amount, max_amount, NEW.policy; |
| 70 | END IF; |
| 71 | |
| 72 | RETURN NEW; |
| 73 | END; |
| 74 | $$ LANGUAGE plpgsql; |
| 75 | |
| 76 | CREATE TRIGGER trigger_validate_payment_amount |
| 77 | BEFORE INSERT OR UPDATE ON project.payment |
| 78 | FOR EACH ROW |
| 79 | EXECUTE FUNCTION project.validate_payment_amount(); |
| 80 | |
| 81 | }}} |