-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathfuelstationdatabase.sql
902 lines (797 loc) · 28.5 KB
/
fuelstationdatabase.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
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
CREATE SCHEMA fuelstationdatabase;
SET SEARCH_PATH TO fuelstationdatabase;
CREATE DOMAIN dom_codice_azienda AS integer
CHECK(VALUE BETWEEN 1 AND 99);
CREATE DOMAIN dom_codice_stazione AS integer
CHECK(VALUE BETWEEN 100 AND 1000);
CREATE DOMAIN dom_quantita_serbatoio AS integer
CHECK(VALUE BETWEEN 0 AND 80000);
CREATE DOMAIN dom_numero_settimana AS INTEGER
CHECK(VALUE BETWEEN 1 AND 52);
CREATE DOMAIN dom_cf_persona AS char(16);
CREATE TABLE AZIENDA(
codice dom_codice_azienda PRIMARY KEY,
responsabile varchar(52) NOT NULL,
comune varchar(30) NOT NULL
);
CREATE TABLE STAZIONE_DI_RIFORNIMENTO(
codice dom_codice_stazione PRIMARY KEY,
comune varchar(30) NOT NULL,
latitudine char(5) NOT NULL,
longitudine char(5) NOT NULL,
codiceAzienda dom_codice_azienda NOT NULL,
foreign key (codiceAzienda) REFERENCES AZIENDA(codice) ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TABLE POMPA(
numero int,
codiceStazione dom_codice_stazione,
tipoCarburante varchar(10) NOT NULL,
foreign key (codiceStazione) REFERENCES STAZIONE_DI_RIFORNIMENTO(codice) ON UPDATE CASCADE ON DELETE CASCADE,
PRIMARY KEY (numero, codiceStazione)
);
CREATE TABLE CARBURANTE(
tipo varchar(10) PRIMARY KEY,
numeroDiPompe int NOT NULL
);
CREATE TABLE TIPO1(
CF dom_cf_persona PRIMARY KEY,
telefono char(10) NOT NULL,
residenza varchar(40) NOT NULL,
nome varchar(27) NOT NULL,
cognome varchar(24) NOT NULL,
codiceAzienda dom_codice_azienda NOT NULL,
codiceStazione dom_codice_stazione NOT NULL,
foreign key (codiceAzienda) REFERENCES AZIENDA(codice) ON UPDATE CASCADE ON DELETE CASCADE,
foreign key (codiceStazione) REFERENCES STAZIONE_DI_RIFORNIMENTO(codice) ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TABLE TIPO2(
CF dom_cf_persona PRIMARY KEY,
telefono char(10) NOT NULL,
residenza varchar(40) NOT NULL,
nome varchar(27) NOT NULL,
cognome varchar(24) NOT NULL,
codiceAzienda dom_codice_azienda NOT NULL,
foreign key (codiceAzienda) REFERENCES AZIENDA(codice) ON UPDATE CASCADE ON DELETE CASCADE
);
CREATE TABLE PIANO_DI_LAVORO_SETTIMANALE(
numeroSettimana dom_numero_settimana PRIMARY KEY
);
CREATE TABLE PIANO_DI_LAVORO_GIORNALIERO(
giorno varchar(9),
CFDipendente dom_cf_persona NOT NULL,
codiceStazione dom_codice_stazione NOT NULL,
numeroSettimana dom_numero_settimana NOT NULL,
foreign key (CFDipendente) REFERENCES TIPO2(CF) ON UPDATE CASCADE ON DELETE CASCADE,
foreign key (codiceStazione) REFERENCES STAZIONE_DI_RIFORNIMENTO(codice) ON UPDATE CASCADE ON DELETE CASCADE,
foreign key (numeroSettimana) REFERENCES PIANO_DI_LAVORO_SETTIMANALE(numeroSettimana) ON DELETE CASCADE,
PRIMARY KEY (giorno, CFDipendente, codiceStazione)
);
CREATE TABLE FORNISCE(
quantitaDisponibile dom_quantita_serbatoio NOT NULL,
capacitaMassima dom_quantita_serbatoio NOT NULL,
tipoCarburante varchar(10) NOT NULL,
codiceStazione dom_codice_stazione NOT NULL,
foreign key (codiceStazione) REFERENCES STAZIONE_DI_RIFORNIMENTO(codice) ON UPDATE CASCADE ON DELETE CASCADE,
foreign key (tipoCarburante) REFERENCES CARBURANTE(tipo) ON UPDATE CASCADE ON DELETE CASCADE,
PRIMARY KEY (codiceStazione, tipoCarburante),
CONSTRAINT quantita CHECK (quantitaDisponibile <= capacitaMassima)
);
CREATE TABLE EROGA(
tipoCarburante varchar(10),
numeroPompa int,
codiceStazione dom_codice_stazione,
foreign key (tipoCarburante) REFERENCES CARBURANTE(tipo) ON UPDATE CASCADE ON DELETE CASCADE,
foreign key (numeroPompa,codiceStazione) REFERENCES POMPA(numero,codiceStazione) ON UPDATE CASCADE ON DELETE CASCADE,
PRIMARY KEY (tipoCarburante, numeroPompa, codiceStazione)
);
--------------------------------------------------------------------------------------------------
-- --
-- TRIGGER --
-- --
--------------------------------------------------------------------------------------------------
-- TRIGGER #1: un dipendente di tipo 1 deve lavorare presso
-- stazioni di rifornimento solo appartenenti all'azienda per
-- cui lavora
CREATE OR REPLACE FUNCTION verifica_dipendenti()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM AZIENDA AS A WHERE A.codice = old.codiceazienda;
IF FOUND
THEN
PERFORM * FROM TIPO1 AS T1, STAZIONE_DI_RIFORNIMENTO AS STAZIONE
WHERE new.codiceStazione = STAZIONE.codice AND
new.codiceAzienda <> STAZIONE.codiceAzienda;
IF FOUND
THEN
RAISE NOTICE 'dipendente lavora per una stazione non di proprieta di azienda per cui lavora';
RETURN null;
ELSE
RETURN new;
END IF;
ELSE
RETURN new;
END IF;
END;
$$;
create trigger controllo_dipendenti
before insert or update on TIPO1
for each row
execute procedure verifica_dipendenti();
-- TRIGGER #2: un dipendente di tipo 2 deve lavorare presso
-- stazioni di rifornimento solo appartenenti all'azienda
-- per cui lavora
CREATE OR REPLACE FUNCTION verifica_dipendenti_tipo2()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM AZIENDA AS A WHERE A.codice = old.codiceazienda;
IF FOUND
THEN
PERFORM * FROM TIPO2, PIANO_DI_LAVORO_GIORNALIERO AS PLG, STAZIONE_DI_RIFORNIMENTO AS STAZIONE
WHERE STAZIONE.codice = PLG.codiceStazione AND
new.codiceAzienda <> STAZIONE.codiceAzienda;
IF FOUND
THEN
RAISE NOTICE 'dipendente lavora per una stazione non di proprieta di azienda per cui lavora';
RETURN null;
ELSE
RETURN new;
END IF;
ELSE
RETURN new;
END IF;
END;
$$;
create trigger controllo_dipendenti_tipo2
before insert or update on TIPO2
for each row
execute procedure verifica_dipendenti_tipo2();
-- TRIGGER #3: codifica il vincolo (2, N)
-- nella relazione tipo2-HA-piano_di_lavoro_giornaliero
-- ci devono essere almeno 2 stazioni diverse nel
-- piano di lavoro giornaliero per ogni dipendente
-- se elimino un piano di lavoro da piano di lavoro giornaliero
CREATE OR REPLACE FUNCTION verifica_vincolo_stazioni_multiple()
RETURNS trigger
language plpgsql as
$$
declare
numstazioni integer;
pianistaz integer;
telefono1 char(10);
residenza1 varchar(40);
nome1 varchar(27);
cognome1 varchar(24);
codiceAzienda1 dom_codice_azienda;
codiceStazione1 dom_codice_stazione;
BEGIN
SELECT count(DISTINCT codiceStazione) into numstazioni from PIANO_DI_LAVORO_GIORNALIERO AS PLG where PLG.CFDipendente=old.CFDipendente group by CFDipendente;
SELECT count(*) into pianistaz from PIANO_DI_LAVORO_GIORNALIERO AS PLG WHERE PLG.codiceStazione=old.codiceStazione and PLG.CFDipendente=old.CFDipendente group by CFDipendente,codiceStazione;
IF numstazioni<2 or (numstazioni=2 and pianistaz<2)
THEN
RAISE NOTICE 'Il dipendente lavora in UNA SOLA stazione, trasferisci da tipo2 a tipo1';
PERFORM * from tipo2 where cf=old.cfdipendente;
if found then
select telefono into telefono1 from tipo2 where old.CFDipendente=cf;
select residenza into residenza1 from tipo2 where old.CFDipendente=cf;
select nome into nome1 from tipo2 where old.CFDipendente=cf;
select cognome into cognome1 from tipo2 where old.CFDipendente=cf;
select codiceAzienda into codiceAzienda1 from tipo2 where old.CFDipendente=cf;
select codiceStazione into codiceStazione1 from piano_di_lavoro_giornaliero where old.CFDipendente=CFdipendente and codiceStazione<>old.codiceStazione;
delete from tipo2 where old.CFDipendente=cf;
perform * from tipo1 where cf=old.cfdipendente;
if not found then
insert into TIPO1(CF,telefono,residenza,nome,cognome,codiceAzienda,codiceStazione) values (old.CFDipendente,telefono1,residenza1,nome1,cognome1,codiceAzienda1,codiceStazione1);
end if;
perform * from PIANO_DI_LAVORO_GIORNALIERO where CFDipendente=old.CFDipendente and codicestazione<>old.codiceStazione;
if found then
delete from PIANO_DI_LAVORO_GIORNALIERO where CFDipendente=old.CFDipendente and codicestazione<>old.codiceStazione;
end if;
return null;
else
return old;
END IF;
ELSE
RETURN old;
END IF;
END;
$$;
create trigger controllo_stazioni_multiple_piano
before delete on PIANO_DI_LAVORO_GIORNALIERO
for each row
execute procedure verifica_vincolo_stazioni_multiple();
-- se aggiorno stazioni presso cui lavora nel piano
CREATE OR REPLACE FUNCTION verifica_vincolo_stazioni_multiple_update()
RETURNS trigger
language plpgsql as
$$
declare
numstazioni integer;
pianistaz integer;
telefono1 char(10);
residenza1 varchar(40);
nome1 varchar(27);
cognome1 varchar(24);
codiceAzienda1 dom_codice_azienda;
codiceStazione1 dom_codice_stazione;
BEGIN
SELECT count(DISTINCT codicestazione) into numstazioni from PIANO_DI_LAVORO_GIORNALIERO AS PLG where PLG.CFDipendente=new.CFDipendente group by CFDipendente;
SELECT count(*) into pianistaz from PIANO_DI_LAVORO_GIORNALIERO AS PLG WHERE PLG.codiceStazione=new.codiceStazione and PLG.CFDipendente=new.CFDipendente
group by CFDipendente,codiceStazione;
IF numstazioni<=2
THEN
RAISE NOTICE 'Il dipendente lavora in UNA SOLA stazione, trasferisci da tipo2 a tipo1';
PERFORM * from tipo2 where cf=new.cfdipendente;
if found then
select telefono into telefono1 from tipo2 where new.CFDipendente=cf;
select residenza into residenza1 from tipo2 where new.CFDipendente=cf;
select nome into nome1 from tipo2 where new.CFDipendente=cf;
select cognome into cognome1 from tipo2 where new.CFDipendente=cf;
select codiceAzienda into codiceAzienda1 from tipo2 where new.CFDipendente=cf;
select codiceStazione into codiceStazione1 from piano_di_lavoro_giornaliero where new.CFDipendente=CFdipendente and codiceStazione=new.codiceStazione;
delete from tipo2 where new.CFDipendente=cf;
perform * from tipo1 where cf=new.cfdipendente;
if not found then
insert into TIPO1(CF,telefono,residenza,nome,cognome,codiceAzienda,codiceStazione) values (new.CFDipendente,telefono1,residenza1,nome1,cognome1,codiceAzienda1,codiceStazione1);
end if;
perform * from PIANO_DI_LAVORO_GIORNALIERO where CFDipendente=new.CFDipendente and codicestazione<>new.codiceStazione;
if found then
delete from PIANO_DI_LAVORO_GIORNALIERO where CFDipendente=new.CFDipendente and codicestazione<>new.codiceStazione;
end if;
return null;
else
return new;
END IF;
ELSE
RETURN new;
END IF;
END;
$$;
create trigger controllo_stazioni_multiple_piano_update
before update on PIANO_DI_LAVORO_GIORNALIERO
for each row when (new.codiceStazione <> old.codiceStazione)
execute procedure verifica_vincolo_stazioni_multiple_update();
-- TRIGGER #4 stazione rifornimento non deve fornire carburante
-- non erogato da una sua pompa
-- insert or update on FORNISCE
CREATE OR REPLACE FUNCTION verifica_vincolo_carburante()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM EROGA, POMPA where new.codiceStazione=eroga.codiceStazione and POMPA.codiceStazione=EROGA.codiceStazione and new.tipoCarburante=EROGA.tipoCarburante;
IF NOT FOUND THEN
RAISE NOTICE 'non deve fornire carburante non erogato da una sua pompa';
RETURN NULL;
ELSE RETURN new;
END IF;
END;
$$;
create trigger controllo_carburante
before insert or update on FORNISCE
for each row
execute procedure verifica_vincolo_carburante();
-- delete on EROGA
CREATE OR REPLACE FUNCTION verifica_vincolo_carburante_delete()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S, POMPA AS P where S.codice=old.codiceStazione AND P.numero=old.numeroPompa;
IF FOUND THEN
PERFORM * FROM FORNISCE where old.codiceStazione=FORNISCE.codiceStazione and old.tipoCarburante=FORNISCE.tipoCarburante;
IF FOUND THEN
RAISE NOTICE 'non deve fornire carburante non erogato da una sua pompa';
RETURN NULL;
ELSE
RETURN old;
END IF;
ELSE
RETURN old;
END IF;
END;
$$;
create trigger controllo_carburante_delete
before delete on EROGA
for each row
execute procedure verifica_vincolo_carburante_delete();
-- update tipoCarburante on EROGA
CREATE OR REPLACE FUNCTION verifica_vincolo_carburante_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM FORNISCE where new.codiceStazione=FORNISCE.codiceStazione and new.tipoCarburante=FORNISCE.tipoCarburante;
IF NOT FOUND THEN
RAISE NOTICE 'non deve fornire carburante non erogato da una sua pompa';
RETURN NULL;
ELSE RETURN new;
END IF;
END;
$$;
create trigger controllo_carburante_update
before update on EROGA
for each row when (new.tipoCarburante <> old.tipoCarburante)
execute procedure verifica_vincolo_carburante_update();
-- TRIGGER #5 dipendente tipo 2 non può spostarsi da una stazione
-- all'altra in uno stesso giorno
CREATE OR REPLACE FUNCTION verifica_giorno()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM PIANO_DI_LAVORO_GIORNALIERO AS PDG where new.CFDipendente=PDG.CFDipendente AND new.giorno=PDG.giorno AND old.codiceStazione<>PDG.codiceStazione;
IF FOUND THEN
RAISE NOTICE 'non deve lavorare per una stazione differente nello stesso giorno';
RETURN NULL;
ELSE RETURN new;
END IF;
END;
$$;
-- insert or update codiceStazione in PIANO_DI_LAVORO_GIORNALIERO
create trigger controllo_giorno
before insert on PIANO_DI_LAVORO_GIORNALIERO
for each row
execute procedure verifica_giorno();
create trigger controllo_giorno_update
before update on PIANO_DI_LAVORO_GIORNALIERO
for each row when (new.codiceStazione <> old.codiceStazione)
execute procedure verifica_giorno();
-- Vincoli lato 1,N su 1
-- TRIGGER #6: azienda lato N - stazione di rifornimento lato 1
-- ogni azienda possiede almeno una stazione di rifornimento
CREATE or REPLACE FUNCTION verifica_cardinalita_azienda()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM AZIENDA AS A, STAZIONE_DI_RIFORNIMENTO AS S1 WHERE A.codice=S1.codiceAzienda and A.codice=old.codiceAzienda;
IF FOUND THEN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S WHERE S.codiceAzienda=old.codiceAzienda and S.codice <> old.codice;
if NOT FOUND then
RAISE NOTICE 'ogni azienda possiede almeno una stazione di rifornimento';
RETURN NULL;
else
RETURN old;
end if;
ELSE
RETURN old;
END IF;
END;
$$;
create trigger controllo_cardinalita_azienda
before delete on STAZIONE_DI_RIFORNIMENTO
for each row execute procedure verifica_cardinalita_azienda();
CREATE or REPLACE FUNCTION verifica_cardinalita_azienda_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM AZIENDA AS A, STAZIONE_DI_RIFORNIMENTO AS S1 WHERE A.codice=S1.codiceAzienda and A.codice=old.codiceAzienda;
IF FOUND THEN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S WHERE S.codiceAzienda=old.codiceAzienda and S.codice <> new.codice;
if NOT FOUND then
RAISE NOTICE 'ogni azienda possiede almeno una stazione di rifornimento';
RETURN NULL;
else
RETURN new;
end if;
ELSE
return new;
END IF;
END;
$$;
create trigger controllo_cardinalita_azienda_update
before update on STAZIONE_DI_RIFORNIMENTO
for each row when (new.codiceAzienda <> old.codiceAzienda)
execute procedure verifica_cardinalita_azienda_update();
-- TRIGGER #7: stazione lato N - piano di lavoro lato 1
-- ogni stazione possiede almeno un piano di lavoro giornaliero
CREATE or REPLACE FUNCTION verifica_cardinalita_stazione()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S, PIANO_DI_LAVORO_GIORNALIERO AS PDG1 where S.codice=PDG1.codiceStazione and PDG1.codiceStazione=old.codiceStazione;
if FOUND then
PERFORM * FROM PIANO_DI_LAVORO_GIORNALIERO AS PDG WHERE PDG.codiceStazione=old.codiceStazione AND (PDG.CFDipendente<>old.CFDipendente OR PDG.giorno<>old.giorno);
if NOT FOUND then
RAISE NOTICE 'ogni stazione possiede almeno un piano di lavoro giornaliero ';
RETURN null;
else
RETURN old;
end if;
else
RETURN old;
end if;
END;
$$;
create trigger controllo_cardinalita_stazione
before delete on PIANO_DI_LAVORO_GIORNALIERO
for each row execute procedure verifica_cardinalita_stazione();
CREATE or REPLACE FUNCTION verifica_cardinalita_stazione_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S, PIANO_DI_LAVORO_GIORNALIERO AS PDG1 where S.codice=PDG1.codiceStazione and PDG1.codiceStazione=old.codiceStazione;
IF FOUND THEN
PERFORM * FROM PIANO_DI_LAVORO_GIORNALIERO AS PDG WHERE PDG.codiceStazione=old.codiceStazione AND (PDG.CFDipendente<>old.CFDipendente OR PDG.giorno<>old.giorno);
if NOT FOUND then
RAISE NOTICE 'ogni stazione possiede almeno un piano di lavoro giornaliero ';
RETURN NULL;
else
RETURN new;
end if;
else
RETURN new;
end if;
END;
$$;
create trigger controllo_cardinalita_stazione_update
before update on PIANO_DI_LAVORO_GIORNALIERO
for each row when (new.codiceStazione <> old.codiceStazione)
execute procedure verifica_cardinalita_stazione_update();
-- TRIGGER #8: stazione lato N, tipo1 lato 1
-- ogni stazione presenta almeno un dipendente di tipo1
CREATE or REPLACE FUNCTION verifica_cardinalita_stazione_dip()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S1, TIPO1 AS T1 WHERE S1.codice=old.codiceStazione AND T1.codiceStazione=S1.codice;
IF FOUND THEN
PERFORM * FROM TIPO1 AS T WHERE T.CF<>old.CF and T.codiceStazione=old.codiceStazione;
if NOT FOUND then
RAISE NOTICE 'ogni stazione presenta almeno un dipendente di tipo1';
RETURN NULL;
else
RETURN old;
end if;
ELSE
return old;
END IF;
END;
$$;
create trigger controllo_cardinalita_stazione_dip
before delete on TIPO1
for each row execute procedure verifica_cardinalita_stazione_dip();
CREATE or REPLACE FUNCTION verifica_cardinalita_stazione_dip_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S1, TIPO1 AS T1 WHERE S1.codice=old.codiceStazione AND T1.codiceStazione=S1.codice;
IF FOUND THEN
PERFORM * FROM TIPO1 AS T WHERE T.CF<>new.CF and T.codiceStazione=old.codiceStazione;
if NOT FOUND then
RAISE NOTICE 'ogni stazione presenta almeno un dipendente di tipo1';
RETURN NULL;
else
RETURN new;
end if;
else
return new;
end if;
END;
$$;
create trigger controllo_cardinalita_stazione_dip_update
before update on TIPO1
for each row when (new.codiceStazione <> old.codiceStazione)
execute procedure verifica_cardinalita_stazione_dip_update();
-- TRIGGER #9: azienda lato N - tipo1 lato 1
-- Ogni azienda ha almeno un dipendente tipo1 che lavora per essa
CREATE or REPLACE FUNCTION verifica_cardinalita_azienda_tipo1()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM AZIENDA AS A, TIPO1 AS T1 WHERE A.codice=T1.codiceAzienda and A.codice=old.codiceAzienda;
IF FOUND THEN
PERFORM * FROM TIPO1 AS T WHERE T.CF<>old.CF and T.codiceAzienda=old.codiceAzienda;
if NOT FOUND then
RAISE NOTICE 'ogni azienda ha almeno un dipendente tipo1 che lavora per essa';
RETURN NULL;
else
RETURN old;
end if;
ELSE
RETURN old;
END IF;
END;
$$;
create trigger controllo_cardinalita_azienda_tipo1
before delete on TIPO1
for each row execute procedure verifica_cardinalita_azienda_tipo1();
CREATE or REPLACE FUNCTION verifica_cardinalita_azienda_tipo1_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM AZIENDA AS A, TIPO1 AS T1 WHERE A.codice=T1.codiceAzienda and A.codice=old.codiceAzienda;
IF FOUND THEN
PERFORM * FROM TIPO1 AS T WHERE T.CF<>new.CF and T.codiceAzienda=old.codiceAzienda;
if NOT FOUND then
RAISE NOTICE 'ogni azienda ha almeno un dipendente tipo1 che lavora per essa';
RETURN NULL;
else
RETURN new;
end if;
ELSE
RETURN new;
END IF;
END;
$$;
create trigger controllo_cardinalita_azienda_tipo1_update
before update on TIPO1
for each row when (new.codiceAzienda <> old.codiceAzienda)
execute procedure verifica_cardinalita_azienda_tipo1_update();
-- TRIGGER #10: azienda lato N - tipo2 lato 1
-- Ogni azienda ha almeno un dipendente tipo2 che lavora per essa
CREATE or REPLACE FUNCTION verifica_cardinalita_azienda_tipo2()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM AZIENDA AS A, TIPO2 AS T2 WHERE A.codice=T2.codiceAzienda and A.codice=old.codiceAzienda;
IF FOUND THEN
PERFORM * FROM TIPO2 AS T WHERE T.CF<>old.CF and T.codiceAzienda=old.codiceAzienda;
if NOT FOUND then
RAISE NOTICE 'ogni azienda ha almeno un dipendente tipo2 che lavora per essa';
RETURN NULL;
else
RETURN old;
end if;
ELSE
RETURN old;
END IF;
END;
$$;
create trigger controllo_cardinalita_azienda_tipo2
before delete on TIPO2
for each row execute procedure verifica_cardinalita_azienda_tipo2();
CREATE or REPLACE FUNCTION verifica_cardinalita_azienda_tipo2_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM AZIENDA AS A, TIPO2 AS T2 WHERE A.codice=T2.codiceAzienda and A.codice=old.codiceAzienda;
IF FOUND THEN
PERFORM * FROM TIPO2 AS T WHERE T.CF<>new.CF and T.codiceAzienda=old.codiceAzienda;
if NOT FOUND then
RAISE NOTICE 'ogni azienda ha almeno un dipendente tipo2 che lavora per essa';
RETURN NULL;
else
RETURN new;
end if;
ELSE
RETURN new;
END IF;
END;
$$;
create trigger controllo_cardinalita_azienda_tipo2_update
before update on TIPO2
for each row when (new.codiceAzienda <> old.codiceAzienda)
execute procedure verifica_cardinalita_azienda_tipo2_update();
-- TRIGGER #11: stazione lato N - pompa lato 1
-- Ogni stazione dispone di almeno una pompa
CREATE or REPLACE FUNCTION verifica_cardinalita_stazione_pompa()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S, POMPA AS P1 WHERE S.codice=P1.codiceStazione AND S.codice=old.codiceStazione;
IF FOUND THEN
PERFORM * FROM POMPA AS P WHERE P.numero<>old.numero and P.codiceStazione=old.codiceStazione;
if NOT FOUND then
RAISE NOTICE 'ogni stazione dispone di almeno una pompa';
RETURN NULL;
else
RETURN old;
end if;
ELSE
RETURN old;
END IF;
END;
$$;
create trigger controllo_cardinalita_stazione_pompa
before delete on POMPA
for each row execute procedure verifica_cardinalita_stazione_pompa();
CREATE or REPLACE FUNCTION verifica_cardinalita_stazione_pompa_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S, POMPA AS P1 WHERE S.codice=P1.codiceStazione AND S.codice=old.codiceStazione;
IF FOUND THEN
PERFORM * FROM POMPA AS P WHERE P.numero<>new.numero and P.codiceStazione=old.codiceStazione;
if NOT FOUND then
RAISE NOTICE 'ogni stazione disponde di almeno una pompa';
RETURN NULL;
else
RETURN new;
end if;
ELSE
return new;
end if;
END;
$$;
create trigger controllo_cardinalita_stazione_pompa_update
before update on POMPA
for each row when (new.codiceStazione<>old.codiceStazione)
execute procedure verifica_cardinalita_stazione_pompa_update();
-- TRIGGER #12: piano_di_lavoro_settimanale lato N - piano_di_lavoro_giornaliero lato 1
-- Ogni pds dispone di almeno un pdg
CREATE or REPLACE FUNCTION verifica_cardinalita_pds()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM PIANO_DI_LAVORO_SETTIMANALE AS PDS, PIANO_DI_LAVORO_GIORNALIERO AS PDG1 where PDS.numeroSettimana=PDG1.numeroSettimana and PDG1.numeroSettimana=old.numeroSettimana;
if FOUND then
PERFORM * FROM PIANO_DI_LAVORO_GIORNALIERO AS PDG WHERE PDG.numeroSettimana=old.numeroSettimana AND (PDG.CFDipendente<>old.CFDipendente OR PDG.giorno<>old.giorno OR PDG.codiceStazione<>old.codiceStazione);
if NOT FOUND then
RAISE NOTICE 'ogni piano di lavoro settimanale possiede almeno un piano di lavoro giornaliero ';
RETURN null;
else
RETURN old;
end if;
else
RETURN old;
end if;
END;
$$;
create trigger controllo_cardinalita_pds
before delete on PIANO_DI_LAVORO_GIORNALIERO
for each row execute procedure verifica_cardinalita_pds();
CREATE or REPLACE FUNCTION verifica_cardinalita_pds_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM PIANO_DI_LAVORO_SETTIMANALE AS PDS, PIANO_DI_LAVORO_GIORNALIERO AS PDG1 where PDS.numeroSettimana=PDG1.numeroSettimana and PDG1.numeroSettimana=old.numeroSettimana;
IF FOUND THEN
PERFORM * FROM PIANO_DI_LAVORO_GIORNALIERO AS PDG WHERE PDG.numeroSettimana=old.numeroSettimana AND (PDG.CFDipendente<>old.CFDipendente OR PDG.giorno<>old.giorno OR PDG.codiceStazione<>old.codiceStazione);
if NOT FOUND then
RAISE NOTICE 'ogni piano di lavoro settimanale possiede almeno un piano di lavoro giornaliero ';
RETURN NULL;
else
RETURN new;
end if;
else
RETURN new;
end if;
END;
$$;
create trigger controllo_cardinalita_pds_update
before update on PIANO_DI_LAVORO_GIORNALIERO
for each row when (new.numeroSettimana <> old.numeroSettimana)
execute procedure verifica_cardinalita_pds_update();
-- TRIGGER #13
-- stazione almeno un tipo di carburante (se elimino o update in fornisce)
CREATE or REPLACE FUNCTION verifica_cardinalita_fornisce_carburante()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S, FORNISCE AS F, CARBURANTE AS T where S.codice=F.codiceStazione and F.tipoCarburante=T.tipo and F.tipoCarburante=old.tipoCarburante and F.codiceStazione=old.codiceStazione;
if FOUND then
PERFORM * FROM FORNISCE AS F1 WHERE old.tipoCarburante <> F1.tipoCarburante AND F1.codiceStazione=old.codiceStazione;
if NOT FOUND then
RAISE NOTICE 'ogni stazione fornisce almeno un tipo di carburante';
RETURN null;
else
RETURN old;
end if;
else
RETURN old;
end if;
END;
$$;
create trigger controllo_cardinalita_fornisce_carburante
before delete on FORNISCE
for each row execute procedure verifica_cardinalita_fornisce_carburante();
CREATE or REPLACE FUNCTION verifica_cardinalita_fornisce_carburante_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM STAZIONE_DI_RIFORNIMENTO AS S, FORNISCE AS F, CARBURANTE AS T where S.codice=F.codiceStazione and F.tipoCarburante=T.tipo and F.codiceStazione=old.codiceStazione;
if FOUND then
PERFORM * FROM FORNISCE AS F1 WHERE new.tipoCarburante <> F1.tipoCarburante AND F1.codiceStazione=old.codiceStazione;
if NOT FOUND then
RAISE NOTICE 'ogni stazione fornisce almeno un tipo di carburante';
RETURN null;
else
RETURN new;
end if;
else
RETURN new;
end if;
END;
$$;
create trigger controllo_cardinalita_fornisce_carburante_update
before update on FORNISCE
for each row when (new.codiceStazione <> old.codiceStazione)
execute procedure verifica_cardinalita_fornisce_carburante_update();
-- pompa eroga almeno un tipo di carburante (se elimino o update eroga problema)
CREATE or REPLACE FUNCTION verifica_cardinalita_eroga_carburante()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM POMPA AS P, EROGA AS E, CARBURANTE AS T where P.numero=E.numeroPompa and E.codiceStazione=P.codiceStazione and E.tipoCarburante=T.tipo and T.tipo=old.tipoCarburante and (E.numeroPompa=old.numeroPompa and E.codiceStazione=old.codiceStazione);
if FOUND then
PERFORM * FROM EROGA AS E1 WHERE E1.tipoCarburante <> old.tipoCarburante AND (E1.numeroPompa=old.numeroPompa and E1.codiceStazione=old.codiceStazione);
if NOT FOUND then
RAISE NOTICE 'ogni pompa eroga almeno un tipo di carburante';
RETURN null;
else
RETURN old;
end if;
else
RETURN old;
end if;
END;
$$;
create trigger controllo_cardinalita_eroga_carburante
before delete on EROGA
for each row execute procedure verifica_cardinalita_eroga_carburante();
CREATE or REPLACE FUNCTION verifica_cardinalita_eroga_carburante_update()
RETURNS trigger
language plpgsql as
$$
BEGIN
PERFORM * FROM POMPA AS P, EROGA AS E, CARBURANTE AS T where P.numero=E.numeroPompa and E.codiceStazione=P.codiceStazione and E.tipoCarburante=T.tipo and T.tipo=old.tipoCarburante and (E.numeroPompa=old.numeroPompa and E.codiceStazione=old.codiceStazione);
if FOUND then
PERFORM * FROM EROGA AS E1 WHERE new.tipoCarburante <> E1.tipoCarburante AND (E1.numeroPompa=old.numeroPompa AND E1.codiceStazione=old.codiceStazione);
if NOT FOUND then
RAISE NOTICE 'ogni pompa eroga almeno un tipo di carburante';
RETURN null;
else
RETURN new;
end if;
else
RETURN new;
end if;
END;
$$;
create trigger controllo_cardinalita_eroga_carburante_update
before update on EROGA
for each row when (new.codiceStazione <> old.codiceStazione or new.numeroPompa <> old.numeroPompa)
execute procedure verifica_cardinalita_eroga_carburante_update();
-- TRIGGER #14
-- numero pompe in carburante consistenti con pompe presenti
create or replace function verifica_numeropompe()
RETURNS trigger
language plpgsql as
$$
declare
n integer;
BEGIN
SELECT count(*) into n from POMPA as P where P.tipoCarburante=old.tipoCarburante;
update CARBURANTE set numeroDiPompe=n where tipo=old.tipoCarburante;
RETURN old;
END;
$$;
create or replace function verifica_numeropompe_insorupdate()
RETURNS trigger
language plpgsql as
$$
declare
n integer;
BEGIN
SELECT count(*) into n from POMPA as P where P.tipoCarburante=new.tipoCarburante;
update CARBURANTE set numeroDiPompe=n where tipo=new.tipoCarburante;
RETURN new;
END;
$$;
create trigger controlla_numeropompe
after delete on POMPA
for each row execute procedure verifica_numeropompe();
create trigger controlla_numeropompe_insorupdate
after insert or update on POMPA
for each row execute procedure verifica_numeropompe_insorupdate();