-
Notifications
You must be signed in to change notification settings - Fork 0
/
Triggers.sql
167 lines (126 loc) · 3.38 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
/*
Trigger che aumenta di uno il numero di recensioni per un film quando ne viene inserita una
*/
CREATE TRIGGER aumenta_n_recensione
after insert on streaming_film.recensioni
for each row
UPDATE film
set n_recensioni = n_recensioni + 1
where film.idfilm = new.idfilm
/*
Trigger che riduce di uno il numero di recensioni per un film quando ne viene eliminata una
*/
CREATE TRIGGER riduci_n_recensione
after delete on streaming_film.recensioni
for each row
UPDATE film
set n_recensioni = n_recensioni - 1
where film.idfilm = old.idfilm
/*
Calcola la media dei rating ogni volta che viene aggiunto un nuovo rating
*/
DELIMITER //
CREATE TRIGGER calcola_mediarating_aumento
after insert on streaming_film.recensioni
for each row
BEGIN
DECLARE somma DOUBLE;
DECLARE n INTEGER;
select count(*), sum(rating) into n,somma
from streaming_film.recensioni
where recensioni.idfilm = new.idfilm
group by idfilm;
UPDATE streaming_film.film
set film.mediarating = somma/n
where film.idfilm = new.idfilm;
END//
DELIMITER ;
/*
Calcola la media dei rating ogni volta che viene modificato un rating esistente
*/
DELIMITER //
CREATE TRIGGER calcola_mediarating_modifica
after update on streaming_film.recensioni
for each row
BEGIN
DECLARE somma DOUBLE;
DECLARE n INTEGER;
select count(*), sum(rating) into n,somma
from streaming_film.recensioni
where recensioni.idfilm = new.idfilm
group by idfilm;
UPDATE streaming_film.film
set film.mediarating = somma/n
where film.idfilm = new.idfilm;
END//
DELIMITER ;
/*
Calcola la media dei rating ogni volta che viene eliminato un rating esistente
*/
DELIMITER //
CREATE TRIGGER calcola_mediarating_riduci
after delete on streaming_film.recensioni
for each row
BEGIN
DECLARE somma DOUBLE;
DECLARE n INTEGER;
DECLARE media DOUBLE;
select count(*), sum(rating) into n,somma
from streaming_film.recensioni
where recensioni.idfilm = old.idfilm
group by idfilm;
if n > 0 then
SET media = somma/n;
else
SET media = 0;
end if;
UPDATE streaming_film.film
set film.mediarating = media
where film.idfilm = old.idfilm;
END//
DELIMITER ;
/*
Evita che si modifichi il valore di premium una volta stipulato un contratto
*/
CREATE TRIGGER restore_premium
before update on streaming_film.contratto
for each row
set new.premium = old.premium
/*
Modifica i riferimenti ai clienti cancellati delle recensioni per mantenere le recensioni indicando un utente
generico come relatore della recensione
*/
CREATE TRIGGER mantieni_recensione
before delete on streaming_film.cliente
for each row
update streaming_film.recensioni
set idcliente = 0
where idcliente = old.idcliente;
/*
Indica la data esatta della fine di un contratto non appena creato correggendo eventuali errori o dimenticanze.
*/
DELIMITER //
CREATE TRIGGER check_date
before insert on streaming_film.contratto
for each row
begin
DECLARE n integer;
select (new.datainizio + INTERVAL durata*30 DAY) into n
from tipocontratto
where idtipo = new.idtipo;
set new.datafine = n;
end//
DELIMITER ;
/*
Evita di eliminare un utente che è disattivato
*/
DELIMITER //
CREATE TRIGGER no_eliminazione_cliente_disattivato
before delete on streaming_film.cliente
for each row
begin
if old.disattivato = 1 THEN
SIGNAL sqlstate '45001' set message_text = "Il cliente selezionato è attualmente disattivo. Non è possibile cancellarlo senza la sua autorizzazione!";
end if;
end//
DELIMITER ;