forked from alex1on/DBMS-H.F.R.I---NTUA-6th-Semester
-
Notifications
You must be signed in to change notification settings - Fork 0
/
project-schema.sql
613 lines (524 loc) · 19.6 KB
/
project-schema.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
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
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
SET @OLD_UNIQUE_CHECKS = @@UNIQUE_CHECKS,
UNIQUE_CHECKS = 0;
SET @OLD_FOREIGN_KEY_CHECKS = @@FOREIGN_KEY_CHECKS,
FOREIGN_KEY_CHECKS = 0;
SET @OLD_SQL_MODE = @@SQL_MODE,
SQL_MODE = 'TRADITIONAL';
DROP SCHEMA IF EXISTS project;
CREATE SCHEMA project;
USE project;
--
-- Table structure for table 'Organization'
--
CREATE TABLE Organization (
Organization_ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
Organization_Name VARCHAR(75) NOT NULL,
Abbreviation VARCHAR(15),
City VARCHAR(20),
Street_Name VARCHAR(40),
Street_Number VARCHAR(5),
Zip_Code INT,
Organization_Type ENUM(
'University',
'Research Center',
'Private Corporation'
),
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Organization_ID)
);
--
-- Table structure for table 'Researcher'
--
CREATE TABLE Researcher (
Researcher_ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
First_Name VARCHAR(45) NOT NULL,
Last_Name VARCHAR(45) NOT NULL,
Sex ENUM('Male', 'Female'),
Date_of_Birth DATE NOT NULL,
R_Organization_ID INT UNSIGNED NOT NULL,
Date_of_Entry DATE,
CONSTRAINT fk_Researcher_Organization_ID FOREIGN KEY (R_Organization_ID) REFERENCES Organization(Organization_ID) ON DELETE CASCADE ON UPDATE CASCADE,
/* If we delete an organization then we want to delete it's projects */
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Researcher_ID)
);
--
-- Table structure for table 'Executive'
--
CREATE TABLE Executive (
Executive_ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
First_Name VARCHAR(45) NOT NULL,
Last_Name VARCHAR(45) NOT NULL,
Sex ENUM('Male', 'Female') NOT NULL,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Executive_ID)
);
--
-- Table structure for table 'Program'
--
CREATE TABLE Program (
Program_ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
Program_name VARCHAR(45) NOT NULL,
HFRI_Address VARCHAR(45),
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Program_ID)
);
--
-- Table structure for table 'Project'
--
CREATE TABLE Project (
Project_ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
Title VARCHAR(50) NOT NULL,
Summary TEXT,
Starting_Date DATE NOT NULL,
Ending_Date DATE NOT NULL,
CONSTRAINT Check_Dates CHECK (Ending_Date > Starting_Date),
Amount INT,
CONSTRAINT Check_Amount CHECK (Amount BETWEEN 100000 AND 1000000),
Grade INT,
CONSTRAINT Check_Grade CHECK (Grade BETWEEN 1 AND 100),
Evaluation_Date DATE,
CONSTRAINT Check_Evaluation_Date CHECK (
(Evaluation_Date > "1940-01-01") /* we assume that H.F.R.I was founded in 1940 */
AND (Evaluation_Date < Starting_Date) /* a project must be evaluated first in order to start */
),
Executive_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Project_Executive_ID FOREIGN KEY (Executive_ID) REFERENCES Executive(Executive_ID) ON DELETE RESTRICT ON UPDATE CASCADE,
/* A project must have an executive. So we can't delete it's executive. We have to change project's executive first. */
Organization_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Project_Organization_ID FOREIGN KEY (Organization_ID) REFERENCES Organization(Organization_ID) ON DELETE CASCADE ON UPDATE CASCADE,
/* A project is handled by an organization. So if we delete an organization then we need to delete it's projects too. */
Supervisor_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Project_Supervisor_ID FOREIGN KEY (Supervisor_ID) REFERENCES Researcher(Researcher_ID) ON DELETE RESTRICT ON UPDATE CASCADE,
/* A project must have a supervisor. So we can't delete a supervisor. We have to change project's supervisor first. */
Evaluator_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Project_Evaluator_ID FOREIGN KEY (Evaluator_ID) REFERENCES Researcher(Researcher_ID) ON DELETE RESTRICT ON UPDATE CASCADE,
/* A project must have an evaluator. So we can't delete it's evaluator. We have to change project's evaluator first. */
Program_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Project_Program_ID FOREIGN KEY (Program_ID) REFERENCES Program(Program_ID) ON DELETE RESTRICT ON UPDATE CASCADE,
/* A project is funded by a program. So we can't delete it's program. We have to change the program that fund the project first. */
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Project_ID)
);
--
-- Table structure for table 'Fields'
--
CREATE TABLE Fields (
Field_type VARCHAR(45) NOT NULL,
Field_Description TEXT,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Field_type)
);
--
-- Table structure for table 'Phones'
--
CREATE TABLE Phones (
Organization_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Phones_Organization_ID FOREIGN KEY (Organization_ID) REFERENCES Organization (Organization_ID) ON DELETE CASCADE ON UPDATE CASCADE,
/* If we delete an organization then we don't want too keep its phone numbers. */
Phone_number BIGINT,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Organization_ID, Phone_number)
);
--
-- Table structure for table 'Budget_Funds'
--
CREATE TABLE Budget_Funds (
Organization_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Budget_Funds_Organization_ID FOREIGN KEY (Organization_ID) REFERENCES Organization (Organization_ID) ON DELETE CASCADE ON UPDATE CASCADE,
/* If we delete an organization then we don't want to keep its budget funds */
Budget_type VARCHAR(45),
Amount INT,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Organization_ID, Budget_type)
);
--
-- Table structure for table 'Descibes'
--
CREATE TABLE Describes (
Project_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Describes_Proejct_ID FOREIGN KEY (Project_ID) REFERENCES Project(Project_ID) ON DELETE CASCADE ON UPDATE CASCADE,
/* If there is no project then there is no reason for this table to exist. */
Field_type VARCHAR(45) NOT NULL,
CONSTRAINT fk_Describes_Field_type FOREIGN KEY (Field_type) REFERENCES Fields(Field_type) ON DELETE CASCADE ON UPDATE CASCADE,
/* If there is no Field then there is no reason for this table to exist. */
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Project_ID, Field_type)
);
--
-- Table structure for table 'Deliverable'
--
CREATE TABLE Deliverable (
Deliverable_ID INT UNSIGNED NOT NULL AUTO_INCREMENT,
Title VARCHAR(45),
Summary TEXT,
Delivery_Date DATE,
Project_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Deliverable_Proejct_ID FOREIGN KEY (Project_ID) REFERENCES Project(Project_ID) ON DELETE CASCADE ON UPDATE CASCADE,
/* If we delete deliverable's project then we want to delete deliverable too. */
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Deliverable_ID,Project_ID)
);
--
-- Table structure for table 'Works_On'
--
CREATE TABLE Works_On (
Researcher_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Works_On_Researcher_ID FOREIGN KEY (Researcher_ID) REFERENCES Researcher(Researcher_ID) ON DELETE CASCADE ON UPDATE CASCADE,
/* If there is no reasercher then there is no reason for this table to exist. */
Project_ID INT UNSIGNED NOT NULL,
CONSTRAINT fk_Works_On_Project_ID FOREIGN KEY (Project_ID) REFERENCES Project(Project_ID) ON DELETE CASCADE ON UPDATE CASCADE,
/* If there is no project then there is no reason for this table to exist. */
Active BOOLEAN,
last_update TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (Researcher_ID, Project_ID)
);
ALTER TABLE Researcher
ADD COLUMN age INT as (floor(DATEDIFF(CURRENT_DATE, Date_of_Birth)) / 365),
ADD CONSTRAINT check_Researcher_age CHECK (age BETWEEN 18 AND 80); /* We assume that each researcher can work from 18 yo to 80 yo */
ALTER TABLE Project
ADD COLUMN duration INT as (floor(DATEDIFF(Ending_Date, Starting_Date)) / 365),
ADD CONSTRAINT check_Project_duration CHECK (duration BETWEEN 1 AND 4), /* Duration 1-4 years */
ADD COLUMN Active BOOLEAN as ((Starting_Date < CURRENT_DATE) AND (Ending_Date > CURRENT_DATE))
;
/*#############################################################################*/
/*####################### Triggers for Constraints ########################*/
/*#############################################################################*/
DELIMITER ;;
/* Trigger #1 */
/* Trigger for Starting date */
CREATE TRIGGER Check_Project_Starintg_Date
BEFORE INSERT ON Project
FOR EACH ROW BEGIN
/* Valid starting year 1940 - (current year + 10) */
IF (
(New.Starting_Date < "1940-01-01")
OR
(DATEDIFF(New.Starting_Date, CURRENT_DATE) > 36512) /* 36512 days = 10 years */
) THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid starting date!';
END IF;
END ;;
/* Trigger #2 */
/* Trigger for delivery date */
CREATE TRIGGER Check_Delivery_Date
BEFORE INSERT ON Deliverable
FOR EACH ROW BEGIN
/* Delivery_Date must be between starting and ending date */
IF NOT(
NEW.Delivery_Date BETWEEN (
SELECT Starting_Date
FROM Project
WHERE Project.Project_ID = NEW.Project_ID
)
AND (
SELECT Ending_Date
FROM Project
WHERE Project.Project_ID = NEW.Project_ID
)
) THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid delivery date!';
END IF;
END ;;
/* Trigger #3 */
/* Trigger for Date of Entry */
CREATE TRIGGER Check_Date_of_Entry
BEFORE INSERT ON Researcher
FOR EACH ROW BEGIN
/* Researcher's Date of entry:
1. < current date,
2. year must be > 1940 and
3. 18 years < (Date of entry - Date of birth) < 80 years
*/
IF (
(New.Date_of_Entry > CURDATE())
OR
(NEW.Date_of_Entry < "1940-01-01")
OR
DATEDIFF(New.Date_of_Entry, New.Date_of_Birth) NOT BETWEEN (365 * 18 + 4) AND (365 * 80 + 20)
) THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid date of entry!';
END IF;
END ;;
/* Trigger #4 */
/* Trigger for evaluator */
CREATE TRIGGER check_Evaluator_ID
BEFORE INSERT ON Project
FOR EACH ROW BEGIN
/* Evaluator and project must belong in different organization */
IF (
New.Organization_ID = (
SELECT r.R_Organization_ID
FROM Researcher r WHERE New.Evaluator_ID = r.Researcher_ID
)
) THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid evaluator ID, Evaluator must belong in different organization!';
END IF;
END ;;
/* Trigger #5 */
/* Trigger for researcher's organization */
CREATE TRIGGER check_Researcher_R_Organization_ID
BEFORE INSERT ON Works_On
FOR EACH ROW BEGIN
/* Researcher's projects and researcher must belong to the same organization */
IF(
(
SELECT DISTINCT p.Organization_ID
FROM Project p
INNER JOIN Works_On ON p.Project_ID = New.Project_Id
INNER JOIN Researcher r ON r.Researcher_ID = New.Researcher_ID
)
<>
(
SELECT DISTINCT r.R_Organization_ID
FROM Researcher r
INNER JOIN Works_On ON New.Researcher_ID = r.Researcher_ID
)
)THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid Researcher, Researchers work only on projects for the organizations that employed them!';
END IF;
END ;;
/* Trigger #6 */
/* Trigger for evaluation date */
CREATE TRIGGER check_Project_Evaluation_Date
BEFORE INSERT ON Project
FOR EACH ROW BEGIN
/* Evaluation date must be <= current date */
IF(New.Evaluation_Date > CURDATE())
THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid Evaluation Date, Evaluation date must be <= current date!';
END IF;
END ;;
/* Trigger #7 */
/* Trigger for Date of Birth and Starting Date */
CREATE TRIGGER Check_Date_of_Birth_and_Starting_Date
BEFORE INSERT ON Works_On
FOR EACH ROW BEGIN
/* 18 years < (Project's Starting Date - Researcher's Date of birth) < 80 years
*/
IF (DATEDIFF(
(
SELECT DISTINCT p.Starting_Date
FROM Project p
WHERE NEW.Project_ID = p.Project_ID
)
, (
SELECT DISTINCT r.Date_of_Birth
FROM Researcher r
WHERE r.Researcher_ID = NEW.Researcher_ID)
)
NOT BETWEEN (365 * 18 + 4) AND (365 * 80 + 20))
THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Projetcs starintg date - researchers birth date must be between 18-80 years old!';
END IF;
END ;;
/* Trigger #8 */
/* Trigger for evaluation date and evaluator's date of entry */
CREATE TRIGGER check_Evaluation_Date_and_Evaluators_Date_of_Entry
BEFORE INSERT ON Project
FOR EACH ROW BEGIN
/* Evaluator's Date of Entry <= Evaluation Date */
IF(
(
SELECT r.Date_of_Entry
FROM Researcher r
WHERE New.Evaluator_ID = r.Researcher_ID
) > New.Evaluation_Date
)
THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Evaluators Date of Entry must be <= Projects Evaluation Date!';
END IF;
END ;;
/* Trigger #9 */
/* Trigger for number of phones */
/*
CREATE TRIGGER check_Organization_number_of_phones
BEFORE INSERT ON Organization
FOR EACH ROW BEGIN
/* Organization must have at least two phone numbers
IF(
SELECT count(DISTINCT Phone_number)
FROM Phones ph
INNER JOIN Organization ON ph.Organization_ID = New.Organization_ID
) < 2
THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Organizations must have at least two phone numbers!';
END IF;
END ;;
*/
/*#############################################################################*/
/*######################## Triggers for Updates #########################*/
/*#############################################################################*/
/* Trigger #1 */
/* Trigger for Starting date */
CREATE TRIGGER Check_Project_Starintg_Date_updts
BEFORE UPDATE ON Project
FOR EACH ROW BEGIN
/* Valid starting year 1940 - (current year + 10) */
IF (
(New.Starting_Date < "1940-01-01")
OR
(DATEDIFF(New.Starting_Date, CURRENT_DATE) > 36512) /* 36512 days = 10 years */
) THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid starting date!';
END IF;
END ;;
/* Trigger #2 */
/* Trigger for delivery date */
CREATE TRIGGER Check_Delivery_Date_updts
BEFORE UPDATE ON Deliverable
FOR EACH ROW BEGIN
/* Delivery_Date must be between starting and ending date */
IF NOT(
NEW.Delivery_Date BETWEEN (
SELECT Starting_Date
FROM Project
WHERE Project.Project_ID = NEW.Project_ID
)
AND (
SELECT Ending_Date
FROM Project
WHERE Project.Project_ID = NEW.Project_ID
)
) THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid delivery date!';
END IF;
END ;;
/* Trigger #3 */
/* Trigger for Date of Entry */
CREATE TRIGGER Check_Date_of_Entry_updts
BEFORE UPDATE ON Researcher
FOR EACH ROW BEGIN
/* Researcher's Date of entry:
1. < current date,
2. year must be > 1940 and
3. 18 years < (Date of entry - Date of birth) < 80 years
*/
IF (
(New.Date_of_Entry > CURDATE())
OR
(NEW.Date_of_Entry < "1940-01-01")
OR
DATEDIFF(New.Date_of_Entry, New.Date_of_Birth) NOT BETWEEN (365 * 18 + 4) AND (365 * 80 + 20)
) THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid date of entry!';
END IF;
END ;;
/* Trigger #4 */
/* Trigger for evaluator */
CREATE TRIGGER check_Evaluator_ID_updts
BEFORE UPDATE ON Project
FOR EACH ROW BEGIN
/* Evaluator and project must belong in different organization */
IF (
New.Organization_ID = (
SELECT r.R_Organization_ID
FROM Researcher r WHERE New.Evaluator_ID = r.Researcher_ID
)
) THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid evaluator ID, Evaluator must belong in different organization!';
END IF;
END ;;
/* Trigger #5 */
/* Trigger for researcher's organization */
CREATE TRIGGER check_Researcher_R_Organization_ID_updts
BEFORE UPDATE ON Works_On
FOR EACH ROW BEGIN
/* Researcher's projects and researcher must belong to the same organization */
IF(
(
SELECT DISTINCT p.Organization_ID
FROM Project p
INNER JOIN Works_On ON p.Project_ID = New.Project_Id
INNER JOIN Researcher r ON r.Researcher_ID = New.Researcher_ID
)
<>
(
SELECT DISTINCT r.R_Organization_ID
FROM Researcher r
INNER JOIN Works_On ON New.Researcher_ID = r.Researcher_ID
)
)THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid Researcher, Researchers work only on projects for the organizations that employed them!';
END IF;
END ;;
/* Trigger #6 */
/* Trigger for evaluation date */
CREATE TRIGGER check_Project_Evaluation_Date_updts
BEFORE UPDATE ON Project
FOR EACH ROW BEGIN
/* Evaluation date must be <= current date */
IF(New.Evaluation_Date > CURDATE())
THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Invalid Evaluation Date, Evaluation date must be <= current date!';
END IF;
END ;;
/* Trigger #7 */
/* Trigger for Date of Birth and Starting Date */
CREATE TRIGGER Check_Date_of_Birth_and_Starting_Date_updts
BEFORE UPDATE ON Works_On
FOR EACH ROW BEGIN
/* 18 years < (Project's Starting Date - Researcher's Date of birth) < 80 years
*/
IF (DATEDIFF(
(
SELECT DISTINCT p.Starting_Date
FROM Project p
WHERE NEW.Project_ID = p.Project_ID
)
, (
SELECT DISTINCT r.Date_of_Birth
FROM Researcher r
WHERE r.Researcher_ID = NEW.Researcher_ID)
)
NOT BETWEEN (365 * 18 + 4) AND (365 * 80 + 20))
THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Projetcs starintg date - researchers birth date must be between 18-80 years old!';
END IF;
END ;;
/* Trigger #8 */
/* Trigger for evaluation date and evaluator's date of entry */
CREATE TRIGGER check_Evaluation_Date_and_Evaluators_Date_of_Entry_updts
BEFORE UPDATE ON Project
FOR EACH ROW BEGIN
/* Evaluator's Date of Entry <= Evaluation Date */
IF(
(
SELECT r.Date_of_Entry
FROM Researcher r
WHERE New.Evaluator_ID = r.Researcher_ID
) > New.Evaluation_Date
)
THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Evaluators Date of Entry must be <= Projects Evaluation Date!';
END IF;
END ;;
/* Trigger #9 */
/* Trigger for number of phones */
CREATE TRIGGER check_Organization_number_of_phones_updts
BEFORE UPDATE ON Organization
FOR EACH ROW BEGIN
/* Organization must have at least two phone numbers */
IF(
SELECT count(DISTINCT Phone_number)
FROM Phones ph
INNER JOIN Organization ON ph.Organization_ID = New.Organization_ID
) < 2
THEN SIGNAL SQLSTATE '45000'
SET MESSAGE_TEXT = 'Organizations must have at least two phone numbers!';
END IF;
END ;;
CREATE TRIGGER set_active_works_on
BEFORE INSERT ON Works_ON
FOR EACH ROW BEGIN
SET New.Active = (
(
SELECT DISTINCT p.Ending_Date
FROM Project p
WHERE New.Project_ID = p.Project_ID
) > CURDATE()
);
END;;
SET SQL_MODE = @OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS = @OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS = @OLD_UNIQUE_CHECKS;