-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathTF_Query_4_TriggersAndStoredProcedures.sql
253 lines (196 loc) · 7.5 KB
/
TF_Query_4_TriggersAndStoredProcedures.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
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
-- -----------------------------------------------------------------
-- Data Criacao ...........: 23/01/2023
-- Autor(es) ..............: Letícia Araújo
-- Versao ..............: 1.0
-- Banco de Dados .........: PostgreSQL
-- Descricao .........: Criando triggers para especialização
-- ------------------------------------------------------------------
-- TRIGGER ITEM (Generalização e especialização)
CREATE OR REPLACE FUNCTION check_livro_fc() RETURNS trigger AS $check_livro_fc$
BEGIN
PERFORM * FROM LIVRO WHERE idItem = NEW.idItem;
IF FOUND THEN
RAISE EXCEPTION 'Este item já existe na tabela de livros';
END IF;
RETURN NEW;
END;
$check_livro_fc$ LANGUAGE plpgsql;
-- DROP TRIGGER check_livro ON FERRAMENTA;
CREATE TRIGGER check_livro
BEFORE UPDATE OR INSERT ON FERRAMENTA
FOR EACH ROW EXECUTE PROCEDURE check_livro_fc();
-- DROP TRIGGER check_livro ON POCAO;
CREATE TRIGGER check_livro
BEFORE UPDATE OR INSERT ON POCAO
FOR EACH ROW EXECUTE PROCEDURE check_livro_fc();
-- TRIGGER NPC (Generalização e especialização)
CREATE OR REPLACE FUNCTION check_inimigo_fc() RETURNS trigger AS $check_inimigo_fc$
BEGIN
PERFORM * FROM INIMIGO WHERE idNPC = NEW.idNPC;
IF FOUND THEN
RAISE EXCEPTION 'Este NPC já existe na tabela de inimigos';
END IF;
RETURN NEW;
END;
$check_inimigo_fc$ LANGUAGE plpgsql;
-- DROP TRIGGER check_inimigo ON PROFESSOR;
CREATE TRIGGER check_inimigo
BEFORE UPDATE OR INSERT ON PROFESSOR
FOR EACH ROW EXECUTE PROCEDURE check_inimigo_fc();
-- TRIGGER AREA (Atualização para comandos: Insert, update e delete)
CREATE OR REPLACE FUNCTION update_area() RETURNS trigger AS $update_area$
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE AREA SET NArea = NArea - 1 WHERE idArea = old.idArea;
ELSIF (TG_OP = 'INSERT') then
UPDATE AREA SET NArea = NArea + 1 WHERE idArea = old.idArea;
ELSIF (TG_OP = 'UPDATE') THEN
IF(NEW.idArea <> OLD.idArea) THEN
UPDATE AREA SET NArea = NArea - 1 WHERE idArea = old.idArea;
UPDATE AREA SET NArea = NArea + 1 WHERE idArea = new.idArea;
END IF;
END IF;
RETURN NULL;
END;
$update_area$ LANGUAGE plpgsql;
-- DROP TRIGGER NroDeAreas ON JOGADOR;
CREATE TRIGGER NroDeAreas
AFTER DELETE OR UPDATE OR INSERT ON JOGADOR
FOR EACH ROW EXECUTE PROCEDURE update_area();
-- TRIGGER AREA (Atualização para comandos: Insert, update e delete)
CREATE OR REPLACE FUNCTION update_grimorio() RETURNS trigger AS $update_grimorio$
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE AREA SET Ngrimorio = Ngrimorio - 1 WHERE idGrimorio = old.idGrimorio;
ELSIF (TG_OP = 'INSERT') then
UPDATE AREA SET Ngrimorio = Ngrimorio + 1 WHERE idGrimorio = old.idGrimorio;
ELSIF (TG_OP = 'UPDATE') THEN
IF(NEW.idGrimorio <> OLD.idGrimorio) THEN
UPDATE AREA SET Ngrimorio = Ngrimorio - 1 WHERE idGrimorio = old.idGrimorio;
UPDATE AREA SET Ngrimorio = Ngrimorio + 1 WHERE idGrimorio = new.idGrimorio;
END IF;
END IF;
RETURN NULL;
END;
$update_grimorio$ LANGUAGE plpgsql;
-- DROP TRIGGER NroDeGrimorios ON JOGADOR;
CREATE TRIGGER NroDeGrimorios
AFTER DELETE OR UPDATE OR INSERT ON JOGADOR
FOR EACH ROW EXECUTE PROCEDURE update_grimorio();
-- TRIGGER NPC (Atualização para comandos: Insert, update e delete)
CREATE OR REPLACE FUNCTION update_npc() RETURNS trigger AS $update_npc$
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE AREA SET N_NPC = N_NPC - 1 WHERE idNPC = old.idNPC;
ELSIF (TG_OP = 'INSERT') then
UPDATE AREA SET N_NPC = N_NPC + 1 WHERE idNPC = old.idNPC;
ELSIF (TG_OP = 'UPDATE') THEN
IF(NEW.idNPC <> OLD.idNPC) THEN
UPDATE AREA SET N_NPC = N_NPC - 1 WHERE idNPC = old.idNPC;
UPDATE AREA SET N_NPC = N_NPC + 1 WHERE idNPC = new.idNPC;
END IF;
END IF;
RETURN NULL;
END;
$update_npc$ LANGUAGE plpgsql;
-- DROP TRIGGER NroDeNPC ON DISCIPLINA;
CREATE TRIGGER NroDeNPC
AFTER DELETE OR UPDATE OR INSERT ON DISCIPLINA
FOR EACH ROW EXECUTE PROCEDURE update_npc();
-- DROP TRIGGER NroDeNPC ON LOJA;
CREATE TRIGGER NroDeNPC
AFTER DELETE OR UPDATE OR INSERT ON LOJA
FOR EACH ROW EXECUTE PROCEDURE update_npc();
-- TRIGGER FEITICO (Atualização para comandos: Insert, update e delete)
CREATE OR REPLACE FUNCTION update_feitico() RETURNS trigger AS $update_feitico$
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE AREA SET NFeitico = NFeitico - 1 WHERE idFeitico = old.idFeitico;
ELSIF (TG_OP = 'INSERT') then
UPDATE AREA SET NFeitico = NFeitico + 1 WHERE idFeitico = old.idFeitico;
ELSIF (TG_OP = 'UPDATE') THEN
IF(NEW.idFeitico <> OLD.idFeitico) THEN
UPDATE AREA SET NFeitico = NFeitico - 1 WHERE idFeitico = old.idFeitico;
UPDATE AREA SET NFeitico = NFeitico + 1 WHERE idFeitico = new.idFeitico;
END IF;
END IF;
RETURN NULL;
END;
$update_feitico$ LANGUAGE plpgsql;
-- DROP TRIGGER NroDeFeitico ON GRIMORIO;
CREATE TRIGGER NroDeFeitico
AFTER DELETE OR UPDATE OR INSERT ON GRIMORIO
FOR EACH ROW EXECUTE PROCEDURE update_feitico();
-- DROP TRIGGER NroDeFeitico ON DISCIPLINA;
CREATE TRIGGER NroDeFeitico
AFTER DELETE OR UPDATE OR INSERT ON DISCIPLINA
FOR EACH ROW EXECUTE PROCEDURE update_feitico();
-- TRIGGER ITEM (Atualização para comandos: Insert, update e delete)
CREATE OR REPLACE FUNCTION update_item() RETURNS trigger AS $update_item$
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE AREA SET NItem = NItem - 1 WHERE idItem = old.idItem;
ELSIF (TG_OP = 'INSERT') then
UPDATE AREA SET NItem = NItem + 1 WHERE idItem = old.idItem;
ELSIF (TG_OP = 'UPDATE') THEN
IF(NEW.idItem <> OLD.idItem) THEN
UPDATE AREA SET NItem = NItem - 1 WHERE idItem = old.idItem;
UPDATE AREA SET NItem = NItem + 1 WHERE idItem = new.idItem;
END IF;
END IF;
RETURN NULL;
END;
$update_item$ LANGUAGE plpgsql;
-- DROP TRIGGER NroDeItem ON INSTANCIA_ITEM;
CREATE TRIGGER NroDeItem
AFTER DELETE OR UPDATE OR INSERT ON INSTANCIA_ITEM
FOR EACH ROW EXECUTE PROCEDURE update_item();
-- DROP TRIGGER NroDeItem ON NPC;
CREATE TRIGGER NroDeItem
AFTER DELETE OR UPDATE OR INSERT ON NPC
FOR EACH ROW EXECUTE PROCEDURE update_item();
-- TRIGGER MAPA (Atualização para comandos: Insert, update e delete)
CREATE OR REPLACE FUNCTION update_mapa() RETURNS trigger AS $update_mapa$
BEGIN
IF (TG_OP = 'DELETE') THEN
UPDATE AREA SET NMapa = NMapa - 1 WHERE idMapa = old.idMapa;
ELSIF (TG_OP = 'INSERT') then
UPDATE AREA SET NMapa = NMapa + 1 WHERE idMapa = old.idMapa;
ELSIF (TG_OP = 'UPDATE') THEN
IF(NEW.idMapa <> OLD.idMapa) THEN
UPDATE AREA SET NMapa = NMapa - 1 WHERE idMapa = old.idMapa;
UPDATE AREA SET NMapa = NMapa + 1 WHERE idMapa = new.idMapa;
END IF;
END IF;
RETURN NULL;
END;
$update_mapa$ LANGUAGE plpgsql;
-- DROP TRIGGER NroDeMapa ON REGIAO;
CREATE TRIGGER NroDeMapa
AFTER DELETE OR UPDATE OR INSERT ON REGIAO
FOR EACH ROW EXECUTE PROCEDURE update_mapa();
-- TRIGGER CASA (delete)
CREATE OR REPLACE FUNCTION st_alteracoes_casa() RETURNS trigger AS $st_alteracoes_casa$
BEGIN
RAISE NOTICE 'Statement - Tentou-se remover dados da tabela Casa';
RETURN NULL;
END;
$st_alteracoes_casa$ LANGUAGE plpgsql;
-- DROP TRIGGER st_alteracoes_casa_aviso ON JOGADOR;
CREATE TRIGGER st_alteracoes_casa_aviso
AFTER DELETE ON JOGADOR
EXECUTE PROCEDURE st_alteracoes_casa();
-- RESURGIMENTO DE INIMIGOS NO MAPA;
CREATE OR REPLACE FUNCTION st_respawn_enemy() RETURNS TRIGGER AS $st_respawn_enemy$
BEGIN
PERFORM pg_sleep(10);
UPDATE INSTANCIA_INIMIGO SET pontosvida = old.pontosvidamax WHERE idinstancia_inimigo = old.idinstancia_inimigo;
END;
$st_respawn_enemy$ LANGUAGE plpgsql;
CREATE TRIGGER respawn_enemy
AFTER UPDATE ON INSTANCIA_INIMIGO
EXECUTE PROCEDURE st_respawn_enemy();
SELECT event_object_table AS table_name ,trigger_name
FROM information_schema.triggers
GROUP BY table_name , trigger_name
ORDER BY table_name ,trigger_name