DatabaseProgramming: Triggers.sql

File Triggers.sql, 3.5 KB (added by 231151, 3 weeks ago)
Line 
1-- автоматски означи билет за EXPIRED
2CREATE OR REPLACE FUNCTION trg_expire_ticket()
3RETURNS TRIGGER AS $$
4BEGIN
5 IF NEW.STATUS = 'VALID' AND NEW.PURCHASE_DATE < CURRENT_DATE - INTERVAL '1 day' THEN
6 NEW.STATUS := 'EXPIRED';
7 END IF;
8 RETURN NEW;
9END;
10$$ LANGUAGE plpgsql;
11
12CREATE TRIGGER trg_ticket_expire
13BEFORE INSERT OR UPDATE ON TICKET
14FOR EACH ROW EXECUTE FUNCTION trg_expire_ticket();
15
16
17--спречи бришење на активно возење
18CREATE OR REPLACE FUNCTION trg_prevent_vehicle_delete()
19RETURNS TRIGGER AS $$
20BEGIN
21 IF EXISTS (
22 SELECT 1 FROM TRIP
23 WHERE VEHICLE_ID = OLD.VEHICLE_ID
24 AND STATUS IN ('SCHEDULED', 'IN_PROGRESS')
25 ) THEN
26 RAISE EXCEPTION 'Не може да се избрише возило % — има активни возења.', OLD.VEHICLE_ID;
27 END IF;
28 RETURN OLD;
29END;
30$$ LANGUAGE plpgsql;
31
32CREATE TRIGGER trg_vehicle_delete
33BEFORE DELETE ON VEHICLE
34FOR EACH ROW EXECUTE FUNCTION trg_prevent_vehicle_delete();
35
36
37--автоматски постави статус на pass на EXPIRED
38CREATE OR REPLACE FUNCTION trg_expire_pass()
39RETURNS TRIGGER AS $$
40BEGIN
41 IF NEW.END_DATE < CURRENT_DATE AND NEW.STATUS = 'ACTIVE' THEN
42 NEW.STATUS := 'EXPIRED';
43 END IF;
44 RETURN NEW;
45END;
46$$ LANGUAGE plpgsql;
47
48CREATE TRIGGER trg_pass_expire
49BEFORE INSERT OR UPDATE ON SUBSCRIPTION_PASS
50FOR EACH ROW EXECUTE FUNCTION trg_expire_pass();
51
52
53--спречи двојно закажување на возач
54CREATE OR REPLACE FUNCTION trg_prevent_driver_double_schedule()
55RETURNS TRIGGER AS $$
56BEGIN
57 IF EXISTS (
58 SELECT 1 FROM DRIVER_SCHEDULE
59 WHERE DRIVER_ID = NEW.DRIVER_ID
60 AND SCHEDULE_DATE = NEW.SCHEDULE_DATE
61 AND DRIVER_SCHEDULE_ID != COALESCE(NEW.DRIVER_SCHEDULE_ID, -1)
62 ) THEN
63 RAISE EXCEPTION 'Возачот % веќе е закажан за %.', NEW.DRIVER_ID, NEW.SCHEDULE_DATE;
64 END IF;
65 RETURN NEW;
66END;
67$$ LANGUAGE plpgsql;
68
69CREATE TRIGGER trg_driver_double_schedule
70BEFORE INSERT OR UPDATE ON DRIVER_SCHEDULE
71FOR EACH ROW EXECUTE FUNCTION trg_prevent_driver_double_schedule();
72
73
74--автоматска нотификација при ново доцнење
75CREATE OR REPLACE FUNCTION trg_notify_on_delay()
76RETURNS TRIGGER AS $$
77BEGIN
78 INSERT INTO NOTIFICATION (PASSENGER_ID, TRIP_ID, DELAY_LOG_ID, MESSAGE, NOTIFICATION_TYPE, STATUS)
79 SELECT DISTINCT
80 tk.PASSENGER_ID,
81 NEW.TRIP_ID,
82 NEW.DELAY_ID,
83 'Возењето доцни ' || NEW.DELAY_MINUTES || ' мин. Причина: ' || NEW.DELAY_REASON,
84 'DELAY',
85 'PENDING'
86 FROM TICKET tk
87 WHERE tk.TRIP_ID = NEW.TRIP_ID
88 AND tk.STATUS = 'VALID';
89
90 RETURN NEW;
91END;
92$$ LANGUAGE plpgsql;
93
94CREATE TRIGGER trg_delay_notification
95AFTER INSERT ON DELAY_LOG
96FOR EACH ROW EXECUTE FUNCTION trg_notify_on_delay();
97
98
99--провери дали возилото е активно пред да се закаже ново возење
100CREATE OR REPLACE FUNCTION trg_check_vehicle_active()
101RETURNS TRIGGER AS $$
102DECLARE
103 v_status VARCHAR;
104BEGIN
105 SELECT STATUS INTO v_status
106 FROM VEHICLE
107 WHERE VEHICLE_ID = NEW.VEHICLE_ID;
108
109 IF v_status != 'ACTIVE' THEN
110 RAISE EXCEPTION 'Возилото % не е активно (статус: %).', NEW.VEHICLE_ID, v_status;
111 END IF;
112
113 RETURN NEW;
114END;
115$$ LANGUAGE plpgsql;
116
117CREATE TRIGGER trg_trip_vehicle_active
118BEFORE INSERT ON TRIP
119FOR EACH ROW EXECUTE FUNCTION trg_check_vehicle_active();