Changes between Initial Version and Version 1 of Triggers


Ignore:
Timestamp:
09/11/25 04:04:09 (12 hours ago)
Author:
141515
Comment:

--

Legend:

Unmodified
Added
Removed
Modified
  • Triggers

    v1 v1  
     1== Тригери
     2
     3===Бришење на возила
     4
     5Проверува дали е возилото веќе продадено пред да се избрише од оглас, т.е. дали е означено како продадено. Доколку е и онака е тргнато од оглас за јавноста меѓутоа мора да остани видливо во датабазата за претставништвото кое го огласило со цел за извештаи.
     6
     7{{{
     8CREATE OR REPLACE FUNCTION prevent_sold_vehicle_deletion()
     9RETURNS TRIGGER AS $$
     10BEGIN
     11    IF OLD.status = false THEN
     12        RAISE EXCEPTION 'Cannot delete sold vehicles. Vehicle with VIN % is already sold.', OLD.vin;
     13    END IF;
     14    RETURN OLD;
     15END;
     16$$ LANGUAGE plpgsql;
     17}}}
     18
     19===Дупликат договори
     20
     21Спречува креирање на дупликат договор за едно возило, бидејќи доколку веќе има договор или е продадено или е во постапка на продавање и се чека уплата од клиентот.
     22{{{
     23CREATE OR REPLACE FUNCTION prevent_duplicate_agreements()
     24RETURNS TRIGGER AS $$
     25BEGIN
     26    IF EXISTS (
     27        SELECT 1 FROM agreement
     28        WHERE vin = NEW.vin AND a_id != NEW.a_id
     29    ) THEN
     30        RAISE EXCEPTION 'Vehicle with VIN % already has an agreement. Cannot create duplicate agreement.', NEW.vin;
     31    END IF;
     32    RETURN NEW;
     33END;
     34$$ LANGUAGE plpgsql;
     35
     36CREATE TRIGGER trg_prevent_duplicate_agreements
     37    BEFORE INSERT ON agreement
     38    FOR EACH ROW
     39    EXECUTE FUNCTION prevent_duplicate_agreements();
     40}}}
     41
     42===Валидација на година на возилото
     43
     44Иако на frontend веќе имаме валидација за полињата (како и за година на возило), добро е да се има тригер и во самата база за да не се внесат несакани или погрешни информации. Овој тригер спречува внесување на невалидна година на возило.
     45{{{
     46CREATE OR REPLACE FUNCTION validate_vehicle_year()
     47RETURNS TRIGGER AS $$
     48BEGIN
     49    IF NEW.p_year < 1900 OR NEW.p_year > EXTRACT(YEAR FROM NOW()) + 1 THEN
     50        RAISE EXCEPTION 'Invalid production year: %. Year must be between 1900 and %',
     51            NEW.p_year, EXTRACT(YEAR FROM NOW()) + 1;
     52    END IF;
     53    RETURN NEW;
     54END;
     55$$ LANGUAGE plpgsql;
     56
     57CREATE TRIGGER trg_validate_vehicle_year
     58    BEFORE INSERT OR UPDATE ON vehicle
     59    FOR EACH ROW
     60    EXECUTE FUNCTION validate_vehicle_year();
     61}}}
     62
     63===Генерирање на договор
     64
     65Доколку не е внесен број на договор, овој тригер автоматски ќе внесе.
     66{{{
     67CREATE OR REPLACE FUNCTION generate_agreement_id()
     68RETURNS TRIGGER AS $$
     69BEGIN
     70    IF NEW.a_id IS NULL OR NEW.a_id = '' THEN
     71        NEW.a_id := 'AG' || LPAD(nextval('agreement_id_seq')::TEXT, 6, '0');
     72    END IF;
     73    RETURN NEW;
     74END;
     75$$ LANGUAGE plpgsql;
     76}}}