wiki:Triggers

Version 1 (modified by 141515, 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;
Note: See TracWiki for help on using the wiki.