=== Евалуација **Примери на индекси** Индекс врз колона што често се филтрира: sdate: {{{#!sql CREATE INDEX idx_policy_sdate ON project.policy(sdate); }}} Индекс за подобро JOIN-ирање помеѓу Policy и Payment: {{{#!sql CREATE INDEX idx_payment_policy ON project.payment(policy); }}} Индекс за групирање и филтрирање по тип на пакет: {{{#!sql CREATE INDEX idx_package_type ON project.package(type_pol); }}} ** Примери за тригери ** 1. Проверка на датумска логика {{{#!sql CREATE OR REPLACE FUNCTION project.validate_policy_dates() RETURNS TRIGGER AS $$ BEGIN IF NEW.edate <= NEW.sdate THEN RAISE EXCEPTION 'End date must be after start date. Start: %, End: %', NEW.sdate, NEW.edate; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_validate_policy_dates BEFORE INSERT OR UPDATE ON project.policy FOR EACH ROW EXECUTE FUNCTION project.validate_policy_dates(); }}} 2. Да спречи внесување на плаќање (Payment) кое е поголемо од осигурената вредност {{{#!sql CREATE OR REPLACE FUNCTION project.validate_payment_amount() RETURNS TRIGGER AS $$ DECLARE max_amount NUMERIC; BEGIN -- земи ја максималната дозволена вредност од пакетот SELECT pkg.total INTO max_amount FROM project.policy pol JOIN project.package pkg ON pol.package = pkg.code WHERE pol.p_id = NEW.policy; -- ако не постои поврзана полиса или пакет, кревај грешка IF max_amount IS NULL THEN RAISE EXCEPTION 'Cannot validate payment. No associated policy/package found for policy ID: %', NEW.policy; END IF; -- ако износот на плаќање е поголем од дозволениот, кревај грешка IF NEW.p_amount > max_amount THEN RAISE EXCEPTION 'Payment amount (%.2f) exceeds maximum allowed (%.2f) for policy %', NEW.p_amount, max_amount, NEW.policy; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trigger_validate_payment_amount BEFORE INSERT OR UPDATE ON project.payment FOR EACH ROW EXECUTE FUNCTION project.validate_payment_amount(); }}}