· 9 years ago · Dec 06, 2016, 11:59 AM
1/*1. U bazi autoradionica: Postaviti okidaÄ koji će prilikom brisanja zapisa iz tablice odjel provjeriti da li je taj odjel
2referenciran u tablici kvar ili radnik. Ako je referenciran onda će postaviti vrijednosti tih zapisa u tablicama kvar i radnik na NULL.*/
3
4DELIMITER //
5DROP TRIGGER IF EXISTS okidac //
6CREATE TRIGGER okidac BEFORE DELETE ON odjel
7FOR EACH ROW
8BEGIN
9 UPDATE kvar
10 SET sifOdjel = NULL
11 WHERE sifOdjel = old.sifOdjel;
12
13 UPDATE radnik
14 SET sifOdjel = NULL
15 WHERE sifOdjel = old.sifOdjel;
16END; //
17DELIMITER ;
18
19DELETE FROM odjel
20WHERE sifOdjel = 1;
21
22/*2. U bazi autoradionica: Potrebno je izvesti isti okidaÄ pozivom procedure (napisati proceduru koja će rjeÅ¡avati problematiku
23prethodnog zadatka te okidaÄ koji tu proceduru poziva).*/
24
25DROP PROCEDURE IF EXISTS procka;
26DELIMITER //
27CREATE PROCEDURE procka(IN sifOdjela INT)
28BEGIN
29UPDATE kvar
30 SET sifOdjel = NULL
31 WHERE sifOdjel = sifOdjela;
32
33 UPDATE radnik
34 SET sifOdjel = NULL
35 WHERE sifOdjel = sifOdjela;
36END; //
37DELIMITER ;
38
39DROP TRIGGER IF EXISTS okidac;
40DELIMITER //
41CREATE TRIGGER okidac BEFORE DELETE ON odjel
42FOR EACH ROW
43BEGIN
44 CALL procka(old.sifOdjel);
45END; //
46DELIMITER ;
47
48DELETE FROM odjel
49WHERE sifOdjel = 2;
50
51/*3. U bazi autoradionica: Postaviti okidaÄ koji će prilikom unosa novog zapisa u tablicu nalog provjeriti atribut datPrimitkaNalog. Ako se datum postavlja na neku vrijednost datuma iz budućnosti, tada je potrebno datPrimitkaNalog postaviti na danaÅ¡nji datum
52(dohvatiti trenutni datum sa poslužitelja).*/
53
54DROP TRIGGER IF EXISTS okidac;
55DELIMITER //
56CREATE TRIGGER okidac BEFORE INSERT ON nalog
57FOR EACH ROW
58BEGIN
59 IF new.datPrimitkaNalog > CURDATE()
60 THEN SET new.datPrimitkaNalog = CURDATE();
61 END IF;
62END; //
63DELIMITER ;
64
65INSERT INTO nalog VALUES (1127,34,122, '2017-01-01', 2, 1);
66
67
68/*4. U bazi autoradionica: Potrebno je stvoriti novu tablicu nalog_backup strukture identiÄne strukturi tablice nalog. Napisati okidaÄ koji će prilikom unosa novog zapisa u tablicu nalog, napraviti sigurnosnu kopiju podataka koji se unose, na naÄin da će te iste podatke unijeti i u tablicu nalog_backup.*/
69
70CREATE TABLE nalog_backup (
71sifKlijent INT,
72sifKvar INT,
73sifRadnik INT,
74datPrimtkaNalog DATE,
75prioritetNalog INT,
76OstvareniSatiRada INT
77);
78
79DROP TRIGGER IF EXISTS okidac;
80DELIMITER //
81CREATE TRIGGER okidac AFTER INSERT ON nalog
82FOR EACH ROW
83BEGIN
84 INSERT INTO nalog_backup VALUES (new.sifKlijent, new.sifKvar, new.sifRadnik, new.datPrimitkaNalog, new.prioritetNalog, new. OstvareniSatiRada);
85END; //
86DELIMITER ;
87
88INSERT INTO nalog VALUES (1127,34,122, '2016-01-01', 10, 10);
89
90
91/*5. U bazi autoradionica: Napisati okidaÄ koji će osigurati da se prilikom ažuriranja podataka u tablici radnik, ne može postaviti koeficijent plaće na vrijednost manju od 1 niti veću od 3. Potrebno je:
92a. Ako se postavlja na vrijednost manju od 1, unijeti toÄno 1
93b. Ako se postavlja na vrijednost veću od 3, unijeti toÄno 3*/
94
95DROP TRIGGER IF EXISTS okidac;
96DELIMITER //
97CREATE TRIGGER okidac BEFORE UPDATE ON radnik
98FOR EACH ROW
99BEGIN
100 IF old.KoefPlaca < 1 THEN SET new.KoefPlaca = 1;
101 ELSEIF old.KoefPlaca > 3 THEN SET new.KoefPlaca = 3;
102 END IF;
103END; //
104DELIMITER ;
105
106UPDATE radnik
107SET KoefPlaca= 0.5
108WHERE sifRadnik = 122;
109
110
111
112/*6. U bazi studenti: Napisati okidaÄ koji će osigurati da se prilikom unosa nove n-toke u tablicu studenti ne smije unijeti student sa dupliciranim JMBAG-om. U tom je sluÄaju potrebno onemogućiti unos takve n-torke. U svrthu testiranja privremeno ukloniti oznaku primary key sa atributa JMBAG.*/
113
114ALTER TABLE ocjene DROP FOREIGN KEY fk_ocjene_studenti1;
115
116ALTER TABLE studenti DROP PRIMARY KEY;
117
118DROP TRIGGER IF EXISTS okidac;
119DELIMITER //
120CREATE TRIGGER okidac BEFORE INSERT ON studenti
121FOR EACH ROW
122BEGIN
123 IF new.jmbag IN (SELECT jmbag FROM studenti) THEN
124 CALL nepostojecProcedura();
125 END IF;
126
127END; //
128DELIMITER ;
129
130INSERT INTO studenti VALUES ('0036451631', 'ž', 'ž', '2012-04-04', 10000, 10000, 3);
131
132/*7. U bazi studenti: Tablici studenti dodati novi atribut naziva PolozenihIspita. Napisati okidaÄ koji će se pokretati prilikom unosa nove ocjene za tog studenta. Ako se unosi nova pozitivna ocjena, potrebno je ispuniti novi atribut podatkom koliko je ukupno student položio ispita (sa pozitivnom ocjenom).*/
133
134ALTER TABLE studenti
135ADD COLUMN PolozenihIspita INT;
136
137DROP TRIGGER IF EXISTS okidac;
138DELIMITER //
139CREATE TRIGGER okidac AFTER INSERT ON ocjene
140FOR EACH ROW
141BEGIN
142 IF new.ocjena > 1 THEN
143 UPDATE studenti
144 SET PolozenihIspita = (SELECT COUNT(*) FROM ocjene WHERE jmbagStudent = new.jmbagStudent)
145 WHERE jmbag = new.jmbagStudent;
146 END IF;
147END; //
148DELIMITER ;
149
150INSERT INTO ocjene VALUES(2, '0035177990', '2015-03-01', '18:30:00', 5)
151
152/*8. U bazi studenti u tablicu nastavnici dodati novu kolonu 'lozinkaTimestamp'.
153Potrebno je osigurati da se nakon svake promjene lozinke nekom od nastavnika, automatski upiše vremenska oznaka promjene lozinke u kolonu 'lozinkaTimestamp’ (za tog nastavnika).*/
154
155
156
157ALTER TABLE nastavnici
158ADD COLUMN lozinkaTimestamp DATETIME;
159
160
161DROP TRIGGER IF EXISTS okidac;
162DELIMITER //
163CREATE TRIGGER okidac BEFORE UPDATE ON nastavnici
164FOR EACH ROW
165BEGIN
166 IF new.lozinka != old.lozinka THEN
167 SET new.lozinkaTimestamp = NOW();
168 END IF;
169END; //
170DELIMITER ;
171
172UPDATE nastavnici
173SET lozinka = 'lalala'
174WHERE jmbg= '0205951330124';
175
176**********************************************************************************************************************************
177/* naoraviti okidac koji ce za svaki novi unos u tablicu nalog dodijeliti
178prvi distupni prioritet nalog za taj datum*/
179DROP TRIGGER IF EXISTS nalogic;
180DELIMITER //
181CREATE TRIGGER nalogic
182BEFORE INSERT ON nalog
183FOR EACH ROW
184BEGIN
185DECLARE i INT DEFAULT 1;
186IF new.datPrimitkaNalog IN (SELECT datPrimitkaNalog FROM nalog)
187THEN petlja:LOOP
188 IF i NOT IN (SELECT prioritetNalog FROM nalog
189 WHERE datPrimitkaNalog = new.datPrimitkaNalog) THEN
190SET new.prioritetNalog = i;
191LEAVE petlja;
192ELSE SET i = i+1;
193END IF;
194 END LOOP;
195END IF;
196END; //
197DELIMITER ;
198
199SELECT * FROM nalog
200ORDER BY datPrimitkaNalog ASC, prioritetNalog DESC
201
202INSERT INTO nalog(sifKlijent, sifKvar, sifRadnik, datPrimitkaNalog)
203 VALUES(1, 3, 1, '2004-08-30');
204
205DROP TRIGGER IF EXISTS okidac;
206DELIMITER //
207CREATE TRIGGER okidac BEFORE UPDATE ON nastavnici
208FOR EACH ROW
209BEGIN
210 IF new.lozinka != old.lozinka THEN
211 SET lozinkaTimestamp = NOW();
212 END IF;
213END; //
214DELIMITER ;