Version 1 (modified by 9 hours ago) ( diff ) | ,
---|
Тригери
===Бришење на возила
Проверува дали е возилото веќе продадено пред да се избрише од оглас, т.е. дали е означено како продадено. Доколку е и онака е тргнато од оглас за јавноста меѓутоа мора да остани видливо во датабазата за претставништвото кое го огласило со цел за извештаи.
CREATE OR REPLACE FUNCTION prevent_sold_vehicle_deletion() RETURNS TRIGGER AS $$ BEGIN IF OLD.status = false THEN RAISE EXCEPTION 'Cannot delete sold vehicles. Vehicle with VIN % is already sold.', OLD.vin; END IF; RETURN OLD; END; $$ LANGUAGE plpgsql;
===Дупликат договори
Спречува креирање на дупликат договор за едно возило, бидејќи доколку веќе има договор или е продадено или е во постапка на продавање и се чека уплата од клиентот.
CREATE OR REPLACE FUNCTION prevent_duplicate_agreements() RETURNS TRIGGER AS $$ BEGIN IF EXISTS ( SELECT 1 FROM agreement WHERE vin = NEW.vin AND a_id != NEW.a_id ) THEN RAISE EXCEPTION 'Vehicle with VIN % already has an agreement. Cannot create duplicate agreement.', NEW.vin; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_prevent_duplicate_agreements BEFORE INSERT ON agreement FOR EACH ROW EXECUTE FUNCTION prevent_duplicate_agreements();
===Валидација на година на возилото
Иако на frontend веќе имаме валидација за полињата (како и за година на возило), добро е да се има тригер и во самата база за да не се внесат несакани или погрешни информации. Овој тригер спречува внесување на невалидна година на возило.
CREATE OR REPLACE FUNCTION validate_vehicle_year() RETURNS TRIGGER AS $$ BEGIN IF NEW.p_year < 1900 OR NEW.p_year > EXTRACT(YEAR FROM NOW()) + 1 THEN RAISE EXCEPTION 'Invalid production year: %. Year must be between 1900 and %', NEW.p_year, EXTRACT(YEAR FROM NOW()) + 1; END IF; RETURN NEW; END; $$ LANGUAGE plpgsql; CREATE TRIGGER trg_validate_vehicle_year BEFORE INSERT OR UPDATE ON vehicle FOR EACH ROW EXECUTE FUNCTION validate_vehicle_year();
===Генерирање на договор
Доколку не е внесен број на договор, овој тригер автоматски ќе внесе.
CREATE OR REPLACE FUNCTION generate_agreement_id() RETURNS TRIGGER AS $$ BEGIN IF NEW.a_id IS NULL OR NEW.a_id = '' THEN NEW.a_id := 'AG' || LPAD(nextval('agreement_id_seq')::TEXT, 6, '0'); END IF; RETURN NEW; END; $$ LANGUAGE plpgsql;