DatabaseProgramming: triggers.sql

File triggers.sql, 4.6 KB (added by 231105, 6 days ago)
Line 
1------------------------------------------------------------------
2-- auto_set_reservation_status Marija
3
4CREATE FUNCTION auto_set_reservation_status()
5RETURNS TRIGGER AS $$
6BEGIN
7 IF NEW.expiry_time < CURRENT_DATE THEN
8 NEW.status := 'Expired';
9 ELSE
10 NEW.status := 'Active';
11 END IF;
12
13 RETURN NEW;
14END;
15$$ LANGUAGE plpgsql;
16
17CREATE TRIGGER trg_auto_set_reservation_status
18BEFORE INSERT OR UPDATE ON Reservation
19FOR EACH ROW
20EXECUTE FUNCTION auto_set_reservation_status();
21
22-------------------------------------------------------------
23--prevent_duplicate_seat_booking Nina
24
25CREATE FUNCTION prevent_duplicate_seat_booking()
26RETURNS TRIGGER AS $$
27DECLARE
28 seat_exists INT;
29BEGIN
30 SELECT COUNT(*)
31 INTO seat_exists
32 FROM Ticket
33 WHERE seat_number = NEW.seat_number
34 AND carriage_number = NEW.carriage_number
35 AND "Train Triptrip_id" = NEW."Train Triptrip_id";
36
37 IF seat_exists > 0 THEN
38 RAISE EXCEPTION 'Seat already booked for this train trip!';
39 END IF;
40
41 RETURN NEW;
42END;
43$$ LANGUAGE plpgsql;
44
45CREATE TRIGGER trg_prevent_duplicate_seat_booking
46BEFORE INSERT ON Ticket
47FOR EACH ROW
48EXECUTE FUNCTION prevent_duplicate_seat_booking();
49
50----------------------------------------------------------------------
51--update_trip_status_based_on_delay Nina
52
53CREATE FUNCTION update_trip_status_based_on_delay()
54RETURNS TRIGGER AS $$
55BEGIN
56 IF NEW.delay_minutes > 0 THEN
57 NEW.trip_status := 'Delayed';
58 ELSE
59 NEW.trip_status := 'On Time';
60 END IF;
61
62 RETURN NEW;
63END;
64$$ LANGUAGE plpgsql;
65
66CREATE TRIGGER trg_update_trip_status
67BEFORE INSERT OR UPDATE ON "Train Trip"
68FOR EACH ROW
69EXECUTE FUNCTION update_trip_status_based_on_delay();
70
71----------------------------------------------------------------------------
72--auto_set_transaction_date Marija
73
74CREATE FUNCTION auto_set_transaction_date()
75RETURNS TRIGGER AS $$
76BEGIN
77 IF NEW.transaction_date IS NULL THEN
78 NEW.transaction_date := CURRENT_DATE;
79 END IF;
80
81 RETURN NEW;
82END;
83$$ LANGUAGE plpgsql;
84
85CREATE TRIGGER trg_auto_set_transaction_date
86BEFORE INSERT ON Payment
87FOR EACH ROW
88EXECUTE FUNCTION auto_set_transaction_date();
89
90----------------------------------------------------------------------------------
91-- prevent_employee_trip_overlap Ana
92
93CREATE FUNCTION prevent_employee_trip_overlap()
94RETURNS TRIGGER AS $$
95DECLARE
96 overlap_count INT;
97BEGIN
98 SELECT COUNT(*)
99 INTO overlap_count
100 FROM "Train Trip"
101 WHERE Employeeemployee_id = NEW.Employeeemployee_id
102 AND EmployeePersonEMBG2 = NEW.EmployeePersonEMBG2
103 AND departure_time = NEW.departure_time;
104
105 IF overlap_count > 0 THEN
106 RAISE EXCEPTION
107 'Employee already assigned to another trip at this time!';
108 END IF;
109
110 RETURN NEW;
111END;
112$$ LANGUAGE plpgsql;
113
114CREATE TRIGGER trg_prevent_employee_trip_overlap
115BEFORE INSERT ON "Train Trip"
116FOR EACH ROW
117EXECUTE FUNCTION prevent_employee_trip_overlap();
118
119------------------------------------------------------------------------------
120-- prevent_station_delete_active_trip Ana
121
122CREATE FUNCTION prevent_station_delete_active_trip()
123RETURNS TRIGGER AS $$
124DECLARE
125 trip_count INT;
126BEGIN
127 SELECT COUNT(*)
128 INTO trip_count
129 FROM Ticket
130 WHERE Stationstation_id = OLD.station_id
131 OR Stationstation_id2 = OLD.station_id;
132
133 IF trip_count > 0 THEN
134 RAISE EXCEPTION
135 'Cannot delete station because tickets/trips reference it!';
136 END IF;
137
138 RETURN OLD;
139END;
140$$ LANGUAGE plpgsql;
141
142CREATE TRIGGER trg_prevent_station_delete_active_trip
143BEFORE DELETE ON Station
144FOR EACH ROW
145EXECUTE FUNCTION prevent_station_delete_active_trip();
146
147---------------------------------------------------------------------------
148-- Ana
149CREATE OR REPLACE FUNCTION check_and_mark_overbooked()
150RETURNS TRIGGER
151LANGUAGE plpgsql
152AS $$
153DECLARE
154 v_capacity INT;
155 v_sold_tickets INT;
156BEGIN
157 SELECT t.capacity
158 INTO v_capacity
159 FROM "Train Trip" tt
160 JOIN Train t ON tt.Traintrain_id = t.train_id
161 WHERE tt.trip_id = NEW."Train Triptrip_id";
162
163 SELECT COUNT(*)
164 INTO v_sold_tickets
165 FROM Ticket
166 WHERE "Train Triptrip_id" = NEW."Train Triptrip_id"
167 AND ticket_status = 'Active';
168
169 IF v_sold_tickets > v_capacity THEN
170 UPDATE "Train Trip"
171 SET trip_status = 'Overbooked'
172 WHERE trip_id = NEW."Train Triptrip_id";
173
174 RAISE NOTICE 'Trip % is OVERBOOKED automatically via Trigger. Capacity: %, Sold: %.',
175 NEW."Train Triptrip_id", v_capacity, v_sold_tickets;
176 END IF;
177
178 RETURN NEW;
179END;
180$$;