Version 2 (modified by 12 days ago) ( diff ) | ,
---|
Евалуација
Примери на индекси
Индекс врз колона што често се филтрира: sdate:
CREATE INDEX idx_policy_sdate ON project.policy(sdate);
Индекс за подобро JOIN-ирање помеѓу Policy и Payment:
CREATE INDEX idx_payment_policy ON project.payment(policy);
Индекс за групирање и филтрирање по тип на пакет:
CREATE INDEX idx_package_type ON project.package(type_pol);
Примери за тригери
- Проверка на датумска логика
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();
- Да спречи внесување на плаќање (Payment) кое е поголемо од осигурената вредност
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();
Note:
See TracWiki
for help on using the wiki.