DROP PROCEDURE IF EXISTS eccezione;
DELIMITER |

CREATE PROCEDURE eccezione() 
 UPDATE `Vincolo violato` SET X=1; 
|

DELIMITER ;

DROP TRIGGER IF EXISTS DOTTORE_INS_BEF;
DELIMITER |

CREATE TRIGGER DOTTORE_INS_BEF 
BEFORE INSERT
ON DOTTORE
FOR EACH ROW
BEGIN
 IF new.numero_visite<>0
  THEN call eccezione();
 END IF; 
END
|

DELIMITER ;

DROP TRIGGER IF EXISTS DOTTORE_AGG_BEF;
DELIMITER |

CREATE TRIGGER DOTTORE_AGG_BEF 
BEFORE UPDATE
ON DOTTORE
FOR EACH ROW
BEGIN
 IF new.codice_fiscale NOT IN (SELECT codice_fiscale FROM DOTTORE) 
  AND new.numero_visite<>0
	THEN call eccezione();
 END IF; 
END
|

DELIMITER ;

DROP TRIGGER IF EXISTS VISITA_INS_BEF;
DELIMITER |

CREATE TRIGGER VISITA_INS_BEF 
BEFORE INSERT
ON VISITA
FOR EACH ROW
BEGIN
 DECLARE n INT;
 SELECT numero_visite INTO n FROM DOTTORE WHERE codice_fiscale=NEW.codice_fiscale
and year(NEW.data)=year(now());
 UPDATE DOTTORE SET numero_visite=n+1 WHERE codice_fiscale=NEW.codice_fiscale; 
END
|

DELIMITER ;

DROP TRIGGER IF EXISTS VISITA_CANC_BEF;
DELIMITER |

CREATE TRIGGER VISITA_CANC_BEF 
BEFORE DELETE
ON VISITA
FOR EACH ROW
BEGIN
 DECLARE n INT;
 SELECT numero_visite INTO n FROM DOTTORE WHERE codice_fiscale=OLD.codice_fiscale
and year(OLD.data)=year(now());
 UPDATE DOTTORE SET numero_visite=n-1 WHERE codice_fiscale=OLD.codice_fiscale; 
END
|

DELIMITER ;

DELIMITER ;

DROP TRIGGER IF EXISTS VISITA_AGG_BEF;
DELIMITER |

CREATE TRIGGER VISITA_AGG_BEF 
BEFORE UPDATE
ON VISITA
FOR EACH ROW
BEGIN
 DECLARE n_old, n_new INT;
 SELECT numero_visite INTO n_old FROM DOTTORE WHERE codice_fiscale=OLD.codice_fiscale
	and year(OLD.data)=year(now());
 SELECT numero_visite INTO n_new FROM DOTTORE WHERE codice_fiscale=NEW.codice_fiscale
	and year(NEW.data)=year(now());
 IF year(OLD.data)<>year(NEW.data)
	THEN 
	BEGIN
	IF year(NEW.data)=year(now())
		THEN 
		UPDATE DOTTORE SET numero_visite=n_new+1 WHERE codice_fiscale=NEW.codice_fiscale; 
		IF OLD.codice_fiscale <> NEW.codice_fiscale
			THEN UPDATE DOTTORE SET numero_visite=n_old-1 WHERE codice_fiscale=OLD.codice_fiscale;
		END IF;
	END IF;
	IF year(OLD.data)=year(now())
		THEN
		UPDATE DOTTORE SET numero_visite=n_new-1 WHERE codice_fiscale=NEW.codice_fiscale;
		IF OLD.codice_fiscale <> NEW.codice_fiscale
			THEN UPDATE DOTTORE SET numero_visite=n_old+1 WHERE codice_fiscale=OLD.codice_fiscale;
		END IF;
	END IF;
	END;
 ELSE 
	IF year(new.data)=year(now())
		THEN
		UPDATE DOTTORE SET numero_visite=n_old-1 WHERE codice_fiscale=OLD.codice_fiscale;
		UPDATE DOTTORE SET numero_visite=n_new+1 WHERE codice_fiscale=NEW.codice_fiscale; 
	END IF;
 END IF;
END
|

DELIMITER ;