· 9 years ago · Dec 06, 2016, 11:44 AM
1/* U bazi autoradionica: Postaviti okidaÄ koji će prilikom brisanja zapisa iz tablice odjel provjeriti
2da li je taj odjel referenciran u tablici kvar ili radnik. Ako je referenciran onda će postaviti
3vrijednosti tih zapisa u tablicama kvar i radnik na NULL.*/
4
5DROP TRIGGER IF EXISTS davor_je;
6DELIMITER //
7CREATE TRIGGER davor_je BEFORE DELETE ON odjel
8FOR EACH ROW
9BEGIN
10 DECLARE br INT DEFAULT 0;
11 SELECT COUNT(*) INTO br FROM radnik
12 WHERE sifOdjel = old.sifOdjel;
13 IF br != 0 THEN
14 UPDATE radnik
15 SET sifOdjel = NULL
16 WHERE sifOdjel = old.sifOdjel;
17 END IF;
18 SELECT COUNT(*) INTO br FROM kvar
19 WHERE sifOdjel = old.sifOdjel;
20 IF br != 0 THEN
21 UPDATE kvar
22 SET sifOdjel = NULL
23 WHERE sifOdjel = old.sifOdjel;
24 END IF;
25END; //
26DELIMITER ;
27
28DELETE FROM odjel
29WHERE sifOdjel = 9;
30
31/*U bazi autoradionica: Potrebno je izvesti isti okidaÄ pozivom procedure (napisati proceduru
32koja će rjeÅ¡avati problematiku prethodnog zadatka te okidaÄ koji tu proceduru poziva)*/
33
34DROP PROCEDURE IF EXISTS tip;
35DELIMITER //
36CREATE PROCEDURE tip(sifra INT)
37BEGIN
38 DECLARE br INT DEFAULT 0;
39 SELECT COUNT(*) INTO br FROM radnik
40 WHERE sifOdjel = sifra;
41 IF br != 0 THEN
42 UPDATE radnik
43 SET sifOdjel = NULL
44 WHERE sifOdjel = sifra;
45 END IF;
46 SELECT COUNT(*) INTO br FROM kvar
47 WHERE sifOdjel = sifra;
48 IF br != 0 THEN
49 UPDATE kvar
50 SET sifOdjel = NULL
51 WHERE sifOdjel = sifra;
52 END IF;
53END; //
54DELIMITER ;
55
56DROP TRIGGER IF EXISTS momka;
57CREATE TRIGGER momka BEFORE DELETE ON odjel
58FOR EACH ROW
59 CALL tip(old.sifOdjel);
60DELIMITER ;
61
62DELETE FROM odjel
63WHERE sifOdjel = 9;
64
65/*U bazi autoradionica: Postaviti okidaÄ koji će prilikom unosa novog zapisa u tablicu nalog
66provjeriti atribut datPrimitkaNalog. Ako se datum postavlja na neku vrijednost datuma iz
67budućnosti, tada je potrebno datPrimitkaNalog postaviti na današnji datum (dohvatiti
68trenutni datum sa poslužitelja).*/
69
70DROP TRIGGER IF EXISTS koji;
71DELIMITER //
72CREATE TRIGGER koji BEFORE INSERT ON nalog
73FOR EACH ROW
74BEGIN
75 IF new.datPrimitkaNalog > CURDATE() THEN
76 SET new.datPrimitkaNalog = CURDATE();
77 END IF;
78END; //
79DELIMITER ;
80
81INSERT INTO nalog (sifKlijent, sifKvar, sifRadnik, datPrimitkaNalog, prioritetNalog, OstvareniSatiRada) VALUES (1500, 25, 177, "2016-01-01", 1, 4);
82
83/*U bazi autoradionica: Potrebno je stvoriti novu tablicu nalog_backup strukture identiÄne
84strukturi tablice nalog. Napisati okidaÄ koji će prilikom unosa novog zapisa u tablicu nalog,
85napraviti sigurnosnu kopiju podataka koji se unose, na naÄin da će te iste podatke unijeti i u
86tablicu nalog_backup.*/
87
88CREATE TABLE nalog_backup(sifKlijent INT, sifKvar INT, sifRadnik INT, datPrimitkaNalog DATE, prioritetNalog INT, OstvareniSatiRada INT);
89
90DROP TRIGGER IF EXISTS poklanja;
91CREATE TRIGGER poklanja AFTER INSERT ON nalog
92FOR EACH ROW
93 INSERT INTO nalog_backup(sifKlijent, sifKvar, sifRadnik, datPrimitkaNalog, prioritetNalog, OstvareniSatiRada) VALUES (new.sifKlijent, new.sifKvar, new.sifRadnik, new.datPrimitkaNalog, new.prioritetNalog, new.OstvareniSatiRada);
94
95INSERT INTO nalog (sifKlijent, sifKvar, sifRadnik, datPrimitkaNalog, prioritetNalog, OstvareniSatiRada) VALUES (1500, 25, 177, "2016-01-01", 1, 4);
96
97/*U bazi autoradionica: Napisati okidaÄ koji će osigurati da se prilikom ažuriranja podataka u
98tablici radnik, ne može postaviti koeficijent plaće na vrijednost manju od 1 niti veću od 3.
99Potrebno je:
100a. Ako se postavlja na vrijednost manju od 1, unijeti toÄno 1
101b. Ako se postavlja na vrijednost veću od 3, unijeti toÄno 3*/
102
103DROP TRIGGER IF EXISTS ti;
104DELIMITER //
105CREATE TRIGGER ti BEFORE UPDATE ON radnik
106FOR EACH ROW
107BEGIN
108 IF new.KoefPlaca < 1 THEN
109 SET new.KoefPlaca = 1;
110 ELSEIF new.KoefPlaca > 3 THEN
111 SET new.KoefPlaca = 3;
112 END IF;
113END; //
114DELIMITER ;
115
116UPDATE radnik
117 SET KoefPlaca = 0.5
118 WHERE sifRadnik = 122;
119
120/*U 6. bazi studenti: Napisati okidaÄ koji će osigurati da se prilikom unosa nove n-toke u tablicu
121studenti ne smije unijeti student sa dupliciranim JMBAG-om. U tom je sluÄaju potrebno
122onemogućiti unos takve n-torke. U svrthu testiranja privremeno ukloniti oznaku primary key
123sa atributa JMBAG*/
124
125DROP TRIGGER IF EXISTS kurac;
126ALTER TABLE ocjene DROP FOREIGN KEY fk_ocjene_studenti1;
127ALTER TABLE studenti DROP PRIMARY KEY;
128DELIMITER //
129CREATE TRIGGER kurac BEFORE INSERT ON studenti
130FOR EACH ROW
131BEGIN
132 DECLARE broj INT;
133 SELECT COUNT(*) INTO broj FROM studenti
134 WHERE jmbag = new.jmbag;
135 IF broj != 0 THEN
136 CALL nepostojeca();
137 END IF;
138END; //
139DELIMITER ;
140
141INSERT INTO studenti (jmbag, ime, prezime, datumUpisa, postBrPrebivanje, postBrStanovanja, idSmjer) VALUES ("0010081356", "Marko", "Markovic", "2016-01-01", 10000, 10000, 5);
142
143/*7.U bazi studenti: Tablici studenti dodati novi atribut naziva PolozenihIspita. Napisati okidaÄ
144koji će se pokretati prilikom unosa nove ocjene za tog studenta. Ako se unosi nova pozitivna
145ocjena, potrebno je ispuniti novi atribut podatkom koliko je ukupno student položio ispita (sa
146pozitivnom ocjenom).*/
147
148ALTER TABLE studenti
149ADD COLUMN PolozenihIspita INT;
150
151DROP TRIGGER IF EXISTS a_ne;
152DELIMITER //
153CREATE TRIGGER a_ne BEFORE INSERT ON ocjene
154FOR EACH ROW
155BEGIN
156 IF new.ocjena > 1 THEN
157 UPDATE studenti
158 SET PolozenihIspita = (SELECT COUNT(*) FROM ocjene WHERE ocjena > 1 AND jmbagStudent = new.jmbagStudent) + 1
159 WHERE jmbag = new.jmbagStudent;
160 END IF;
161END; //
162DELIMITER ;
163
164INSERT INTO ocjene (idKolegij, jmbagStudent, datumPolaganja, vrijemePolaganja, ocjena) VALUES (1, "0010081356", "2018-01-01", "10:00:00", 3);
165
166/*7.U bazi studenti: Tablici studenti dodati novi atribut naziva PolozenihIspita. Napisati okidaÄ
167koji će se pokretati prilikom unosa nove ocjene za tog studenta. Ako se unosi nova pozitivna
168ocjena, potrebno je ispuniti novi atribut podatkom koliko je ukupno student položio ispita (sa
169pozitivnom ocjenom).*/
170
171alter table studenti
172add column PolozenihIspita int;
173
174
175create trigger ocjena
176before insert on ocjene
177for each row
178begin
179
180if ocjene.ocjena > 1
181then
182
183update studenti
184 SET PolozenihIspita = (SELECT COUNT(*) FROM ocjene WHERE ocjena > 1 AND jmbagStudent = new.jmbagStudent) + 1
185 WHERE jmbag = new.jmbagStudent;
186 END IF;
187END; //
188DELIMITER ;
189
190INSERT INTO ocjene (idKolegij, jmbagStudent, datumPolaganja, vrijemePolaganja, ocjena) VALUES (1, "0010081356", "2018-01-01", "10:00:00", 3);
191
192
193
194
195/*8.U bazi studenti u tablicu nastavnici dodati novu kolonu 'lozinkaTimestamp'.
196Potrebno je osigurati da se nakon svake promjene lozinke nekom od nastavnika, automatski
197upiše vremenska oznaka promjene lozinke u kolonu 'lozinkaTimestamp’ (za tog nastavnika)*/
198
199
200alter table nastavnici
201add column lozinkaTimestamp timestamp default 0;
202
203create trigger triger
204before update on nastavnici
205for each row
206
207
208set new.lozinkaTimestamp=now();
209
210
211UPDATE nastavnici
212 SET lozinka = "stari_mooooooooj"
213 WHERE jmbg = "0110959390037";
214
215
216
217
218
219
220/* barlovicev */
221
222create table barla(ime varchar(55), prezime varchar(55), nekibroj int, id int primary key);
223delimiter //
224create trigger zaunos
225before insert on barla
226for each row
227
228set nekibroj = 555
229where id=new.id;
230
231end;
232
233
234CREATE TRIGGER zaupdate
235BEFORE update ON barla
236FOR EACH ROW
237
238SET nekibroj = 666
239WHERE id=new.id;
240
241END;
242
243CREATE TRIGGER zabrisati
244BEFORE delete ON barla
245FOR EACH ROW
246
247SET nekibroj = 555
248WHERE id=new.id;
249
250END; //
251
252delimiter ;
253
254/* naoraviti okidac koji ce za svaki novi unos u tablicu nalog dodijeliti
255prvi distupni prioritet nalog za taj datum*/
256drop trigger if exists nalogic;
257delimiter //
258create trigger nalogic
259before insert on nalog
260for each row
261begin
262declare i int default 1;
263if new.datPrimitkaNalog in (select datPrimitkaNalog from nalog)
264then petlja:loop
265if i >5 then LEAVE petlja; end if;
266 if i not in (SELECT prioritetNalog FROM nalog
267 WHERE datPrimitkaNalog = new.datPrimitkaNalog) then
268set new.prioritetNalog = i;
269leave petlja;
270elseif i = 5 then SET new.prioritetNalog = i;
271else set i = i+1;
272END IF;
273 end loop;
274end if;
275end; //
276delimiter ;
277
278select * from nalog
279order by datPrimitkaNalog asc, prioritetNalog desc
280
281insert into nalog(sifKlijent, sifKvar, sifRadnik, datPrimitkaNalog)
282 values(14526, 147852, 11596, '2004-08-30');