-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathTable_creation.sql
More file actions
542 lines (433 loc) · 17.1 KB
/
Table_creation.sql
File metadata and controls
542 lines (433 loc) · 17.1 KB
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
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
-- CREATE SCHEMA desa0045;
CREATE TABLE desa0045.League (
LeagueID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
LeagueName VARCHAR(32) NOT NULL,
Country VARCHAR(32) NOT NULL,
Division SMALLINT NOT NULL,
PRIMARY KEY (LeagueID),
CONSTRAINT LeagueNameLength CHECK (CHAR_LENGTH(LeagueName) > 4),
CONSTRAINT AllDivisions CHECK (Division IN (1, 2, 3, 4))
);
CREATE TABLE desa0045.Team (
TeamID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
League INTEGER NOT NULL,
TeamName VARCHAR(32) NOT NULL,
FoundedYear SMALLINT NOT NULL,
City VARCHAR(32) NOT NULL,
Country VARCHAR(32) NOT NULL,
PRIMARY KEY (TeamID),
CONSTRAINT ToLeague FOREIGN KEY (League) REFERENCES desa0045.League,
CONSTRAINT FoundedYearInPast CHECK (FoundedYear BETWEEN 1700 AND EXTRACT(YEAR FROM CURRENT_DATE))
-- CONSTRAINT TeamNameNotEmpty CHECK (TeamName IS DISTINCT FROM '')
);
CREATE TABLE desa0045.TeamMember (
MemberID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
FirstName VARCHAR(32) NOT NULL,
LastName VARCHAR(32) NOT NULL,
Team INTEGER,
PRIMARY KEY (MemberID),
CONSTRAINT ToTeam FOREIGN KEY (Team) REFERENCES desa0045.Team ON DELETE SET NULL,
CONSTRAINT FirstNameFirstUpper CHECK (FirstName ~ '^[A-Z][a-z]*$'),
CONSTRAINT LastNameFirstUpper CHECK (LastName ~ '^[A-Z][a-z]*$')
);
CREATE TABLE desa0045.Staff (
MemberID INTEGER NOT NULL,
StaffRole VARCHAR(32) NOT NULL,
PRIMARY KEY (MemberID),
CONSTRAINT ToMember FOREIGN KEY (MemberID) REFERENCES desa0045.TeamMember
);
CREATE TABLE desa0045.Player (
MemberID INTEGER NOT NULL,
Position VARCHAR(32) NOT NULL,
Nationality VARCHAR(32) NOT NULL,
BirthDate DATE NOT NULL,
PRIMARY KEY (MemberID),
CONSTRAINT ToMember FOREIGN KEY (MemberID) REFERENCES desa0045.TeamMember,
CONSTRAINT CheckPlayerAge CHECK (BirthDate <= CURRENT_DATE - INTERVAL '6 years' AND BirthDate >= CURRENT_DATE - INTERVAL '100 years'),
CONSTRAINT AllPositions CHECK (Position IN ('Goalkeeper', 'Defender', 'Midfielder', 'Forward'))
);
CREATE TABLE desa0045.Stadium (
StadiumID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
StadiumName VARCHAR(32) NOT NULL,
Capacity INTEGER NOT NULL,
Country VARCHAR(32) NOT NULL,
City VARCHAR(32) NOT NULL,
StadiumAddress VARCHAR(32) NOT NULL,
Price INTEGER NOT NULL,
PRIMARY KEY (StadiumID),
CONSTRAINT CapacityPositive CHECK (Capacity > 0),
CONSTRAINT PriceNotNegative CHECK (Price >= 0)
);
CREATE TABLE desa0045.Match (
MatchID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
Team1 INTEGER NOT NULL, --DEFAULT 0,
Team2 INTEGER NOT NULL, --DEFAULT 0,
Result VARCHAR(5) NOT NULL,
StartTime TIMESTAMP(0) NOT NULL,
EndTime TIMESTAMP(0) ,--DEFAULT StartTime + INTERVAL '2 hours',--NOT NULL,
Stadium INTEGER NOT NULL,
Spectators INTEGER,
TicketPrice SMALLINT,
PRIMARY KEY (MatchID),
CONSTRAINT ToTeam1 FOREIGN KEY (Team1) REFERENCES desa0045.Team,
CONSTRAINT ToTeam2 FOREIGN KEY (Team2) REFERENCES desa0045.Team,
CONSTRAINT ToStadium FOREIGN KEY (Stadium) REFERENCES desa0045.Stadium,
CONSTRAINT StartNotGreaterThanEndTime CHECK (EndTime > StartTime),
CONSTRAINT EndTimeInPast CHECK (EndTime < CURRENT_TIMESTAMP),
CONSTRAINT ResultFormat CHECK (Result LIKE '%-%'),
CONSTRAINT SpectatorCount CHECK (Spectators > 0),
CONSTRAINT TicketPricePositive CHECK (TicketPrice > 0)
);
CREATE TABLE desa0045.Performance (
MatchID INTEGER NOT NULL,
MemberID INTEGER NOT NULL,
Goals SMALLINT NOT NULL DEFAULT 0,
Assists SMALLINT NOT NULL DEFAULT 0,
YellowCards SMALLINT NOT NULL DEFAULT 0,
RedCards SMALLINT NOT NULL DEFAULT 0,
TimePlayed SMALLINT NOT NULL DEFAULT 0,
PRIMARY KEY (MatchID, MemberID),
CONSTRAINT ToMatch FOREIGN KEY (MatchID) REFERENCES desa0045.Match,
CONSTRAINT ToMember FOREIGN KEY (MemberID) REFERENCES desa0045.Player
);
CREATE TABLE desa0045.Referee (
RefereeID INTEGER NOT NULL GENERATED ALWAYS AS IDENTITY,
FirstName VARCHAR(32) NOT NULL,
LastName VARCHAR(32) NOT NULL,
Qualification SMALLINT NOT NULL,
Nationality VARCHAR(32) NOT NULL,
PRIMARY KEY (RefereeID),
CONSTRAINT FirstNameFirstUpper CHECK (FirstName ~ '^[A-Z][a-z]*$'),
CONSTRAINT LastNameFirstUpper CHECK (LastName ~ '^[A-Z][a-z]*$'),
CONSTRAINT AllQualifications CHECK (Qualification IN (1, 2, 3, 4))
);
CREATE TABLE desa0045.Officiate (
RefereeID INTEGER NOT NULL,
MatchID INTEGER NOT NULL,
RoleInMatch VARCHAR(32) NOT NULL,
RefPrice INTEGER NOT NULL,
PRIMARY KEY (RefereeID, MatchID),
CONSTRAINT ToReferee FOREIGN KEY (RefereeID) REFERENCES desa0045.Referee,
CONSTRAINT toMatch FOREIGN KEY (MatchID) REFERENCES desa0045.Match,
CONSTRAINT RefPricePositive CHECK (RefPrice > 0),
CONSTRAINT RoleInMatchValidation CHECK (RoleInMatch IN ('Main', 'Linesman', 'Fourth', 'VAR', 'Additional'))
);
CREATE UNIQUE INDEX UniqueStadiumName ON desa0045.Stadium(LOWER(StadiumName));
CREATE UNIQUE INDEX UniqueLeagueNamePerCountry ON desa0045.League(LOWER(LeagueName), LOWER(Country));
-- CREATE UNIQUE INDEX UniqueAbsoluteStadiumAddress ON desa0045.Stadium(LOWER(Country), LOWER(City), LOWER(StadiumAddress));
CREATE INDEX IndexTeamMemberLastName ON desa0045.TeamMember(LastName);
CREATE INDEX IndexRefereeLastName ON desa0045.Referee(LastName);
-- CREATE INDEX IndexLeagueName ON desa0045.League(LeagueName);
CREATE VIEW PlayerPerformanceInMatch AS
SELECT TM.MemberID, P.Position, T.TeamName, M.MatchID, M.Result, Perf.Goals, Perf.Assists, Perf.YellowCards, Perf.RedCards, Perf.TimePlayed
FROM desa0045.TeamMember TM
JOIN desa0045.Player P ON P.MemberID = TM.MemberID
LEFT OUTER JOIN desa0045.Performance Perf ON Perf.MemberID = TM.MemberID
LEFT OUTER JOIN desa0045.Match M ON Perf.MatchID = M.MatchID
LEFT OUTER JOIN desa0045.Team T ON TM.Team = T.TeamID;
CREATE VIEW PlayersInTeam AS
SELECT TM.MemberID, T.TeamName, TM.FirstName, TM.LastName, P.Position, P.Nationality
FROM desa0045.Player P
JOIN desa0045.TeamMember TM ON P.MemberID = TM.MemberID
RIGHT OUTER JOIN desa0045.Team T ON TM.Team = T.TeamID;
CREATE VIEW TeamGoals AS
SELECT T.TeamID, T.TeamName, T.League, COALESCE(SUM(Perf.Goals), 0) AS "Total goals"
FROM desa0045.Team T
LEFT OUTER JOIN desa0045.TeamMember TM ON T.TeamID = TM.Team
LEFT OUTER JOIN desa0045.Performance Perf ON Perf.MemberID = TM.MemberID
GROUP BY T.TeamID, T.TeamName, T.League;
CREATE VIEW CurrentYearMatches AS
SELECT M.MatchID, T1.TeamName AS TeamName1, T2.TeamName AS TeamName2, M.Result, S.StadiumName
FROM desa0045.Match M
JOIN desa0045.Stadium S ON M.Stadium = S.StadiumID
JOIN desa0045.Team T1 ON T1.TeamID = M.Team1
JOIN desa0045.Team T2 ON T2.TeamID = M.Team2
WHERE EXTRACT(YEAR FROM M.StartTime) = EXTRACT(YEAR FROM CURRENT_DATE);
-- Add LEFT OUTER JOIN between Team and Match if we want to have all the teams and their last match (NULL if the team has never played).
CREATE VIEW LastTeamMatch AS
SELECT T.TeamID, MAX(M.MatchID) AS MatchID
FROM desa0045.Team T
JOIN desa0045.Match M ON M.Team1 = T.TeamID OR M.Team2 = T.TeamID
JOIN desa0045.Performance Perf ON Perf.MatchID = M.MatchID
GROUP BY T.TeamID;
CREATE VIEW SeniorPlayers AS
SELECT P.MemberID, TM.FirstName, TM.LastName, P.Position, P.Nationality, P.BirthDate
FROM desa0045.Player P
JOIN desa0045.TeamMember TM ON TM.MemberID = P.MemberID
WHERE AGE(P.BirthDate) > INTERVAL '50 years';
-- WHERE EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM BirthDate) > 50;
CREATE VIEW SuperStadiums AS
SELECT S.StadiumID, S.StadiumName, S.Capacity, S.Country, S.City, S.StadiumAddress, S.Price
FROM desa0045.Stadium S
WHERE Capacity > 40000 AND EXISTS(
SELECT *
FROM desa0045.Match M
JOIN desa0045.Team T ON M.Team1 = T.TeamID OR M.Team2 = T.TeamID
JOIN desa0045.League L ON T.League = L.LeagueID
WHERE M.Stadium = S.StadiumID AND L.Division = 1
);
CREATE VIEW YoungTalentPlayers AS
SELECT P.MemberID, TM.FirstName, TM.LastName, SUM(Perf.Goals) AS TotalGoals
FROM desa0045.Player P
JOIN desa0045.Performance Perf ON Perf.MemberID = P.MemberID
JOIN desa0045.TeamMember TM ON P.MemberID = TM.MemberID
WHERE AGE(P.BirthDate) < INTERVAL '21 years'
-- WHERE EXTRACT(YEAR FROM CURRENT_DATE) - EXTRACT(YEAR FROM BirthDate) < 21
GROUP BY P.MemberID, TM.FirstName, TM.LastName
HAVING SUM(Perf.Goals) > 5;
CREATE MATERIALIZED VIEW TeamWinsLossesDraws AS
SELECT
T.TeamName,
COUNT(
CASE
WHEN T.TeamID = M.Team1 AND CAST(SUBSTRING(M.Result FROM '(\d+)-') AS INTEGER) > CAST(SUBSTRING(M.Result FROM '-(\d+)') AS INTEGER) THEN 1
WHEN T.TeamID = M.Team2 AND CAST(SUBSTRING(M.Result FROM '-(\d+)') AS INTEGER) > CAST(SUBSTRING(M.Result FROM '(\d+)-') AS INTEGER) THEN 1
END
) AS Wins,
COUNT(
CASE
WHEN T.TeamID = M.Team1 AND CAST(SUBSTRING(M.Result FROM '(\d+)-') AS INTEGER) < CAST(SUBSTRING(M.Result FROM '-(\d+)') AS INTEGER) THEN 1
WHEN T.TeamID = M.Team2 AND CAST(SUBSTRING(M.Result FROM '-(\d+)') AS INTEGER) < CAST(SUBSTRING(M.Result FROM '(\d+)-') AS INTEGER) THEN 1
END
) AS Losses,
COUNT(
CASE
WHEN CAST(SUBSTRING(M.Result FROM '(\d+)-') AS INTEGER) = CAST(SUBSTRING(M.Result FROM '-(\d+)') AS INTEGER) THEN 1
END
) AS Draws
FROM desa0045.Team T
LEFT OUTER JOIN desa0045.Match M ON (T.TeamID = M.Team1 OR T.TeamID = M.Team2)
GROUP BY T.TeamName;
CREATE MATERIALIZED VIEW Leaderboard AS
SELECT TeamName, (Wins * 3 + Draws) AS Points
FROM TeamWinsLossesDraws
ORDER BY Points DESC;
CREATE MATERIALIZED VIEW Top5Players AS
SELECT TM.MemberID, TM.FirstName, TM.LastName, SUM(Perf.Goals) AS TotalGoals, SUM(Perf.Assists) AS TotalAssists
FROM desa0045.TeamMember TM
JOIN desa0045.Player P ON P.MemberID = TM.MemberID
JOIN desa0045.Performance Perf ON Perf.MemberID = TM.MemberID
GROUP BY TM.MemberID, TM.FirstName, TM.LastName
ORDER BY TotalGoals DESC, TotalAssists DESC
FETCH FIRST 5 ROWS ONLY;
CREATE MATERIALIZED VIEW TeamGoalDifference AS
WITH Goals(TeamName, LeagueName, GoalsScored, GoalsConceded) AS (
SELECT T.TeamName, L.LeagueName,
SUM(
CASE
WHEN T.TeamID = M.Team1 THEN CAST(SUBSTRING(M.Result FROM '(\d+)-') AS INTEGER)
WHEN T.TeamID = M.Team2 THEN CAST(SUBSTRING(M.Result FROM '-(\d+)') AS INTEGER)
ELSE 0
END
) AS GoalsScored,
SUM(
CASE
WHEN T.TeamID = M.Team1 THEN CAST(SUBSTRING(M.Result FROM '-(\d+)') AS INTEGER)
WHEN T.TeamID = M.Team2 THEN CAST(SUBSTRING(M.Result FROM '(\d+)-') AS INTEGER)
ELSE 0
END
) AS GoalsConceded
FROM desa0045.Team T
JOIN desa0045.League L ON L.LeagueID = T.League
LEFT JOIN desa0045.Match M ON T.TeamID = M.Team1 OR T.TeamID = M.Team2
GROUP BY T.TeamName, L.LeagueName
)
SELECT TeamName, LeagueName, GoalsScored, GoalsConceded, (GoalsScored - GoalsConceded) AS GoalDifference
FROM Goals;
CREATE FUNCTION SetEndTimeIfNotProvided()
RETURNS TRIGGER AS
$$
BEGIN
IF NEW.EndTime IS NULL THEN
NEW.EndTime := NEW.StartTime + INTERVAL '2 hours';
END IF;
IF NEW.EndTime > CURRENT_TIMESTAMP THEN
RAISE EXCEPTION 'The end time of the match cannot be in the future. Match must be in the past.';
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER DefaultEndTime
BEFORE INSERT OR UPDATE
ON desa0045.Match
FOR EACH ROW
EXECUTE FUNCTION SetEndTimeIfNotProvided();
CREATE FUNCTION CheckSpectatorLimit()
RETURNS TRIGGER AS
$$
BEGIN
IF COALESCE(NEW.Spectators, 0) > (SELECT Capacity FROM desa0045.Stadium WHERE StadiumID = NEW.Stadium) THEN
RAISE EXCEPTION 'Spectators cannot exceed Stadium Capacity';
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER CheckSpectatorLimitTrigger
BEFORE INSERT OR UPDATE
ON desa0045.Match
FOR EACH ROW
EXECUTE FUNCTION CheckSpectatorLimit();
CREATE FUNCTION CheckRefereeQualification()
RETURNS TRIGGER AS
$$
BEGIN
IF (SELECT Ref.Qualification
FROM desa0045.Referee Ref
WHERE Ref.RefereeID = NEW.RefereeID) >
(SELECT L.Division
FROM desa0045.Match M
JOIN desa0045.Team T1 ON M.Team1 = T1.TeamID
JOIN desa0045.Team T2 ON M.Team2 = T2.TeamID
JOIN desa0045.League L ON T1.League = L.LeagueID OR T2.League = L.LeagueID
WHERE M.MatchID = NEW.MatchID) THEN
RAISE EXCEPTION 'Referee does not have the required qualification for this league division.';
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER CheckRefereeQualificationTrigger
BEFORE INSERT OR UPDATE
ON desa0045.Officiate
FOR EACH ROW
EXECUTE FUNCTION CheckRefereeQualification();
-- Both teams must be from the same league, when entered to the match
CREATE FUNCTION CheckIfLeaguesMatch()
RETURNS TRIGGER AS
$$
BEGIN
IF (SELECT League FROM desa0045.Team WHERE TeamID = NEW.Team1) != (SELECT League FROM desa0045.Team WHERE TeamID = NEW.Team2) THEN
RAISE EXCEPTION 'Teams must be from the same league.';
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER CheckIfLeaguesMatchTrigger
BEFORE INSERT OR UPDATE
ON desa0045.Match
FOR EACH ROW
EXECUTE FUNCTION CheckIfLeaguesMatch();
CREATE FUNCTION CheckRedCardInLastMatch()
RETURNS TRIGGER AS
$$
BEGIN
IF EXISTS(
SELECT *
FROM desa0045.Performance Perf
JOIN desa0045.Player P ON P.MemberID = Perf.MemberID
JOIN desa0045.TeamMember TM ON TM.MemberID = P.MemberID
JOIN desa0045.Team T ON T.TeamID = TM.Team
JOIN (SELECT ST.TeamID AS TeamID, SM.MatchID AS MatchID, ROW_NUMBER() OVER (PARTITION BY TeamID ORDER BY MatchID DESC) AS MatcReverseOrder
FROM desa0045.Match SM
JOIN desa0045.Team ST ON SM.Team1 = ST.TeamID OR SM.Team2 = ST.TeamID
ORDER BY SM.MatchID DESC) AS QFS ON Perf.MatchID = QFS.MatchID
WHERE Perf.MemberID = NEW.MemberID
AND Perf.RedCards = 1
AND QFS.MatcReverseOrder = 2
AND QFS.TeamID = TM.Team
-- DO NOT DELETE, maybe will be needed in future
-- AND Perf.MatchID = (SELECT MatchID FROM desa0045.Match M WHERE M.Team1 = TM.Team OR M.Team2 = TM.Team ORDER BY MatchID DESC FETCH FIRST 1 ROWS ONLY OFFSET 1)
) THEN
RAISE EXCEPTION 'Player % cannot play in the current match because they received red card in the previous match.', NEW.MemberID;
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER RedCardPrevention
BEFORE INSERT OR UPDATE
ON desa0045.Performance
FOR EACH ROW
EXECUTE FUNCTION CheckRedCardInLastMatch();
CREATE FUNCTION CheckIfTeamMemberIsStaff()
RETURNS TRIGGER AS
$$
BEGIN
IF EXISTS(
SELECT *
FROM desa0045.Staff St
WHERE St.MemberID = NEW.MemberID
)
THEN
RAISE EXCEPTION 'Staff member already exists with MemberID: %.', NEW.MemberID;
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER TeamMemberRestrictionForPlayer
BEFORE INSERT
ON desa0045.Player
FOR EACH ROW
EXECUTE FUNCTION CheckIfTeamMemberIsStaff();
CREATE FUNCTION CheckIfTeamMemberIsPlayer()
RETURNS TRIGGER AS
$$
BEGIN
IF EXISTS(
SELECT *
FROM desa0045.Player P
WHERE P.MemberID = NEW.MemberID
)
THEN
RAISE EXCEPTION 'Player already exists with MemberID: %.', NEW.MemberID;
END IF;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER TeamMemberRestrictionForStaff
BEFORE INSERT
ON desa0045.Staff
FOR EACH ROW
EXECUTE FUNCTION CheckIfTeamMemberIsPlayer();
-- Materialized views tables update triggers
CREATE FUNCTION RefreshOtherMVTables()
RETURNS TRIGGER AS
$$
BEGIN
REFRESH MATERIALIZED VIEW TeamWinsLossesDraws;
REFRESH MATERIALIZED VIEW Leaderboard;
REFRESH MATERIALIZED VIEW TeamGoalDifference;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER RefreshOtherMVTablesTrigger
AFTER INSERT OR UPDATE
ON desa0045.Match
FOR EACH STATEMENT
EXECUTE FUNCTION RefreshOtherMVTables();
CREATE FUNCTION RefreshTop5PlayersTable()
RETURNS TRIGGER AS
$$
BEGIN
REFRESH MATERIALIZED VIEW Top5Players;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER RefreshTop5PlayersTableTrigger
AFTER INSERT OR UPDATE
ON desa0045.Performance
FOR EACH STATEMENT
EXECUTE FUNCTION RefreshTop5PlayersTable();
CREATE FUNCTION RefreshTeamGDAndLeaderboardTables()
RETURNS TRIGGER AS
$$
BEGIN
REFRESH MATERIALIZED VIEW TeamWinsLossesDraws;
REFRESH MATERIALIZED VIEW TeamGoalDifference;
REFRESH MATERIALIZED VIEW Leaderboard;
RETURN NEW;
END;
$$
LANGUAGE plpgsql;
CREATE TRIGGER RefreshTeamGDAndLeaderboardTablesTrigger
AFTER INSERT OR UPDATE
ON desa0045.Team
FOR EACH STATEMENT
EXECUTE FUNCTION RefreshTeamGDAndLeaderboardTables();