-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtriggers.sql
204 lines (176 loc) · 7.36 KB
/
triggers.sql
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
-- trigger conferenceDayParticipantsLimitExceeded
-- sprawdzenie czy ilość miejsc na dany dzień konferencji
-- nie jest mniejsza od rezerwowanej ilości miejsc
CREATE TRIGGER TRIGGER_conferenceDayParticipantsLimitExceeded ON DayReservations
AFTER INSERT, UPDATE
AS BEGIN
SET NOCOUNT ON
IF((SELECT COUNT(*) from INSERTED) > 1)
OR ((SELECT COUNT(*) from DELETED) > 1) BEGIN
RAISERROR('You cannot insert or update more than one DayReservation at once', 1, 1)
ROLLBACK TRANSACTION
END
DECLARE @placesWantedToReserve int;
SET @placesWantedToReserve = (SELECT ParticipantsNumber FROM INSERTED);
DECLARE @freePlaces int;
SET @freePlaces = dbo.FUNCTION_freePlacesForConferenceDay(
(SELECT ConferenceDayID FROM INSERTED)
);
IF(@freePlaces < @placesWantedToReserve) BEGIN
RAISERROR('You tried to reserve %d places, but only %d are available',
1, 1, @placesWantedToReserve, @freePlaces)
ROLLBACK TRANSACTION
END
END
-- Trigger cancelConferenceReservation
-- przy anulowaniu rezerwacji na konferencję automatycznie
-- anuluje wszystkie przypisane do niej rezerwacje na dni konferencji.
CREATE TRIGGER TRIGGER_cancelConferenceReservation ON Reservations AFTER UPDATE
AS BEGIN
SET NOCOUNT ON;
IF((SELECT COUNT(*) from INSERTED) > 1)
OR ((SELECT COUNT(*) from DELETED) > 1) BEGIN
RAISERROR('You cannot update more than one Reservation at once', 1, 1)
ROLLBACK TRANSACTION
END
UPDATE DayReservations
SET isCancelled = 1
WHERE ReservationID IN(
SELECT I.ReservationID FROM INSERTED as I, DELETED as D
WHERE I.isCancelled = 1 AND D.isCancelled = 0
)
END
-- Trigger workshopParticipantsLimitExceeded
-- sprawdza, czy ilość uczestników podanych w rezerwacji na
-- warsztat nie przekracza ilości miejsc dostępnych na dany warsztat,
-- a także czy nie przekracza ilości miejsc zadeklarowanej w DayReservations.
CREATE TRIGGER TRIGGER_workshopParticipantsLimitExceeded ON WorkshopReservations
AFTER INSERT, UPDATE
AS BEGIN
IF((SELECT COUNT(*) from INSERTED) > 1)
OR ((SELECT COUNT(*) from DELETED) > 1) BEGIN
RAISERROR('You cannot insert or update more than one WorkshopReservation at once', 1, 1)
ROLLBACK TRANSACTION
END
DECLARE @workshopPlacesWantedToReserve int;
DECLARE @freePlacesForWorkshop int;
SET @workshopPlacesWantedToReserve = (SELECT ParticipantsNumber
FROM INSERTED);
SET @freePlacesForWorkshop = dbo.FUNCTION_freePlacesForWorkshop(
(SELECT WorkshopID FROM INSERTED)
)
+ @workshopPlacesWantedToReserve;
IF(@freePlacesForWorkshop < @workshopPlacesWantedToReserve) BEGIN
RAISERROR('You tried to reserve %d places for workshop, but only %d are available',
1, 1, @workshopPlacesWantedToReserve, @freePlacesForWorkshop)
ROLLBACK TRANSACTION
END
DECLARE @placesReservedForDay int;
SET @placesReservedForDay = (SELECT participantsNumber
FROM DayReservations
WHERE DayReservations.DayReservationID =
(SELECT DayReservationID
FROM INSERTED));
IF(@placesReservedForDay < @workshopPlacesWantedToReserve) BEGIN
RAISERROR('You tried to reserve %d places for workshop, but only %d places are reserved for this conference day!',
1, 1, @workshopPlacesWantedToReserve, @placesReservedForDay)
ROLLBACK TRANSACTION
END
END
-- trigger cancelDayReservation
-- przy anulowaniu rezerwacji na dany dzien
-- anuluje rezerwacje na warsztaty
-- powiazane z tą rezerwacją dnia konferencji
CREATE TRIGGER TRIGGER_cancelDayReservation On DayReservations
AFTER UPDATE
AS
BEGIN
IF((SELECT COUNT(*) from INSERTED) > 1)
OR ((SELECT COUNT(*) from DELETED) > 1) BEGIN
RAISERROR('You cannot update more than one DayReservation at once', 1, 1)
ROLLBACK TRANSACTION
END
UPDATE WorkshopReservations SET IsCancelled = 1
WHERE DayReservationID IN (
SELECT I.DayReservationID
FROM INSERTED AS I, DELETED AS D
WHERE I.isCancelled = 1 AND D.isCancelled = 0
)
END
-- trigger createWorkshop
-- sprawdza czy przy tworzeniu warsztatu podano limit uczestników
-- mniejszy lub rowny limitowi uczestników na dany dzien
CREATE TRIGGER TRIGGER_createWorkshop ON Workshops
AFTER INSERT
AS
BEGIN
DECLARE @workshopLimit int;
DECLARE @dayLimit int;
SET @workshopLimit = (SELECT ParticipantsLimit FROM INSERTED);
SET @dayLimit = (SELECT ParticipantsLimit
FROM ConferenceDays
WHERE ConferenceDayID = (SELECT ConferenceDayID
FROM INSERTED));
IF(@dayLimit < @workshopLimit)
BEGIN
RAISERROR('You tried to create a workshop with participants limit of %d places, but %d is the limit of places for this day!', 1, 1,
@workshopLimit, @dayLimit)
ROLLBACK TRANSACTION
END
END
-- trigger registerForConferenceDay
-- uruchamia się kiedy próbujemy zarejestrować osobę na rezerwację dnia
-- Konferencji w której wykorzystano już wszystkie miejsca
CREATE TRIGGER TRIGGER_registerForConferenceDay On DayRegistrations
AFTER INSERT
AS
BEGIN
IF(dbo.FUNCTION_freePlacesForConferenceDayReservation((SELECT DayReservationID
FROM INSERTED)) = 0)
BEGIN
RAISERROR('All places for this reservation are already taken', 1, 1)
ROLLBACK TRANSACTION
END
END
-- trigger registerForWorkshop
-- uruchamia się kiedy próbujemy zarejestrować osobę na rezerwację warsztatu
-- w której wykorzystano już wszystkie miejsca
CREATE TRIGGER TRIGGER_registerForWorkshop On WorkshopRegistrations
AFTER INSERT
AS
BEGIN
IF(dbo.FUNCTION_freePlacesForWorkshopReservation((SELECT WorkshopReservationID
FROM INSERTED)) = 0)
BEGIN
RAISERROR('All places for this reservation are already taken', 1, 1)
ROLLBACK TRANSACTION
END
END
-- Trigger reservationWorkshopReservationsCollision
-- sprawdza, czy warsztat na który użytkownik rezerwuję miejsce
-- nie przecina się z innymi warsztatami na które ten użytkownik
-- jest już zarejestrowany
CREATE TRIGGER TRIGGER_workshopReservationsCollision
ON WorkshopRegistrations
AFTER INSERT
AS
BEGIN
SET NOCOUNT ON;
IF EXISTS
(
SELECT * FROM INSERTED AS wr
JOIN DayRegistrations AS dr ON dr.DayRegistrationID = wr.DayRegistrationID
CROSS APPLY dbo.FUNCTION_participantWorkshopList(dr.ParticipantID) AS w1
JOIN WorkshopReservations wres
on wr.WorkshopReservationID = wres.WorkshopReservationID
JOIN Workshops AS w ON w.WorkshopID = wres.WorkshopID
WHERE dbo.FUNCTION_workshopCollision(w1.WorkshopID, w.WorkshopID) = 1
AND w1.WorkshopID <> w.WorkshopID
)
BEGIN
THROW 51000, 'You cannot register participant for this workshop,
because selected participant is already registered
for workshop on this time', 1
ROLLBACK TRANSACTION;
END
END