| Version 1 (modified by , 7 weeks 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;
