Projecte

De Lordwektabyte Wiki
< ASIX/M10/UF1
La revisió el 11:29, 15 abr 2020 per Guillem (discussió | contribucions) (Guillem ha mogut M10/UF1/A08 a ASIX/M10/UF1/A08 sense deixar una redirecció: Crear subnivell ASIX)
(dif) ← Versió més antiga | Versió actual (dif) | Versió més nova → (dif)
Salta a la navegació Salta a la cerca


Disseny i implentació d'un sistema de gestió de BBDD

Guillem Solà i Boeck (host: PC05)

Introducció

Hem de crear una base de dades per a gestionar i mantenir un control dels tractaments mèdics que s'apliquen als animals d'una explotació ramadera. Ens interessa poder tenir un control de l'stock de medicaments, saber quins medicaments es necessiten per a cada tractament i tenir constància de qui ha administrat un medicament a un animal. Per a modificar i accedir a les dades ho farem a través de procediments i funcions que implementaré de manera que l'usuari final només hagi d'utilitzar aquests procediments/funcions amb diversos paràmetres per tal de tenir la informació que desitgi. També s'afegiran procediments de manera que es puguin exportar llistats a PDF o CSV per a imprimir.

Anàlisi del sistema

Definició del sistema

Necessitarem un ordinador que albergui el software gestor de la base de dades.

Sistema operatiu 
- CentOS 7
Sistema gestor de la base de dades 
- MariaDB
Software de desenvolupament i manteniment de la base de dades 
- MySQL Workbench

Requisits del projecte

Legals

A la base de dades desarem informació referent a persones només per a tenir un control de qui hagi administrat un medicament a un animal. Tal com s'ha definit anteriorment, a la taula de persones, no hi desem informació sotmesa a la Llei de Protecció de Dades; per tant, no es tindrà en compte el compliment de la LOPD en aquest projecte.

Propietat intel·lectual i llicències

El software que s'usarà és tot open source i per tant es pot fer l'ús que se'n vulgui.

  • Pel que fa al sistema operatiu, està desenvolupat i distribuït sota la llicència GPL principalment, és gratuït i, per tant, no es necessita cap permís addicional per a utilitzar-lo.
  • Respecte al SGBD MariaDB també està distribuït sota llicència GNU/GPL. Per tant podem usar aquest software sense cap cost i, fins i tot, podríem modificar-ne el codi font si necessitéssim adaptar-lo a alguna necessitat molt específica.
  • Finalment, el software des del que farem el manteniment també està sotmès a la llicència GNU/GPL2 com la resta de programari necessari per a realitzar aquest projecte.
Es pot trobar més informació sobre aquesta llicència a la següent pàgina web
http://www.gnu.org/licenses/old-licenses/gpl-2.0.html

Accés

El SGBD s'assegurarà mitjançant diferents rols d'usuari: administrador, treballador i veterinari. Els permisos per a les taules s'ajustaran en funció del rol d'aquests. Internament hi ha una taula de persones que permetrà desar informació de qui ha administrat un medicament a un animal.

Gestió de còpies de seguretat

Mètode
El sistema de backups es durà a terme mitjançant la comanda que incorpora MariaDB mysqldump. Es mantindrà una còpia en local i s'enviarà una còpia de l'arxiu resultant a un servidor extern a l'empresa per a tenir encara més seguretat de la còpia en cas de robatori d'equip informàtic, incendis, inundacions, etc. També s'implementarà un sistema de rotació de les còpies de manera que les còpies més antigues s'eliminin del sistema i es vagin mantenint les més recents.
Freqüència
S'estudiarà la freqüència amb la que cal fer les còpies per tal de trobar un equilibri entre espai consumit pels backups i aconseguir la menor pèrdua de dades possible (idealment 0) en cas de necessitat de restaurar d'emergència. S'haurà de tenir en compte que l'espai consumit al principi, mentre la BBDD sigui petita, serà tant baix que permetrà disposar de molts backups sense haver-nos de preocupar de l'espai; però a mida que vagi creixent, s'haurà d'anar arranjant el pla de còpies per a gestionar l'espai consumit ajustant la freqüència amb la que farem còpies i la rotació d'aquestes còpies.
Programació
S'utilitzarà el cron ja inclòs en el sistema operatiu per tal d'agendar els processos de còpia de seguretat, l'enviament de l'arxiu a través de scp cap a un altre servidor remot i la rotació de les còpies.

Manteniment i administració

Hi ha dues opcions possibles:

  • El client s'encarregarà de formar a una persona responsable del manteniment i administració del sistema. El pressupost d'aquest projecte inclou unes hores de formació i explicació del funcionament del sistema per a aquesta persona.
  • Contractar un pla de manteniment amb un pack d'hores mensual a la nostra empresa.

En el cas que el client esculli la segona opció, es farà un pressupost (extern a aquest projecte) adequat al tamany del sistema garantint unes hores de manteniment mensuals màximes que podrà dedicar la nostra empresa per a fer manteniment i administració del sistema.

Definició d'interfícies d'usuari

La interacció entre el sistema gestor de la base de dades i els usuaris es farà a través del programa MySQL Workbench ja que és una opció més atractiva de cara a l'usuari que no pas una interfície en mode text. Com que el sistema està orientat a usuaris no-tècnics, crec que serà la millor opció ja que una bona interfície gràfica dóna sempre més seguretat que no pas una interfície de línia d'ordres, per a aquest tipus d'usuaris. Més endavant es podria plantejar un aplicatiu web mitjançant PHP que encara permetria tenir una GUI més polida i ajustada a les necessitats dels usuaris. Els registres de les transaccions i consultes es desaran a la taula de logs que podrà ser revisada pel responsable o l'administrador del sistema per a poder diagnosticar possibles errors o dubtes que puguin sorgir al principi de la implantació del sistema.

Disseny del sistema

Model conceptual

S'ha produït un error en crear la miniatura: No es pot desar la miniatura a la destinació

Model lògic de les taules

animal(idAnimal, dib, dataNaixement)
PK:idAnimal
administracio(idAdministracio, idAnimal, idPersona, idTractament, data)
PK:idAdministracio
FK:idAnimal ⇨ animal(idAnimal)
FK:idPersona ⇨ persona(idPersona)
FK:idTractament ⇨ tractament(idTractament)
persona(idPersona, tipusPersona, nom)
PK:idPersona
FK:tipusPersona ⇨ tipusPersona(idTipusPersona)
tipusPersona(idTipusPersona, descripcio)
PK:idTipusPersona
tractament(idTractament, descripcio)
PK:idTractament
medicament(idMedicament, descripcio, stock, dosi, tempsEsperaCarn, tempsEsperaLlet)
PK:idMedicament
medicaments_dels_tractaments(idMedicament,idTractament)
PK:(idMedicament,idTractament)
FK:idMedicament ⇨ medicament(idMedicament)
FK:idTractament ⇨ tractament(idTractament)
logs(idLog, data, contingut)
PK:idLog

Descripció lògica de les taules

ANIMAL
Atribut Descripció Tipus de dada NULL Observació
idAnimal Identificador de l'animal CHAR(4) NO Clau primària
dib Document Identificador Boví CHAR(20) NO Únic
dataNaixement Data de naixement de l'animal DATE NO
ADMINISTRACIO
Atribut Descripció Tipus de dada NULL Observació
idAdministracio Codi de l'administració de medicament CHAR(4) NO Clau primària
idAnimal Codi animal CHAR(4) NO Clau externa
idPersona Codi persona CHAR(4) NO Clau externa
idTractament Codi tractament CHAR(4) NO Clau externa
data Data de l'administració del medicament DATE NO
PERSONA
Atribut Descripció Tipus de dada NULL Observació
idPersona Codi de persona CHAR(4) NO Clau primària
tipusPersona Codi tipus persona CHAR(4) NO Clau externa
nom Nom de la persona VARCHAR(45) NO
TIPUSPERSONA
Atribut Descripció Tipus de dada NULL Observació
idTipusPersona Codi del tipus de persona CHAR(4) NO Clau primària
tipusPersona Codi tipus persona CHAR(4) NO Clau externa
descripcio Descripció tipus de persona VARCHAR(45) NO
TRACTAMENT
Atribut Descripció Tipus de dada NULL Observació
idTractament Codi del tractament CHAR(4) NO Clau primària
descripcio Nom del tractament VARCHAR(45) NO
MEDICAMENT
Atribut Descripció Tipus de dada NULL Observació
idMedicament Codi del medicament CHAR(4) NO Clau primària
descripcio Nom del medicament VARCHAR(45) NO
stock Quantitat disponible del medicament INT NO
dosi Dosi normal d'administració del medicament FLOAT(4,2) NO En mm
tempsEsperaCarn Temps d'exclusió per a consum de la carn INT En dies
tempsEsperaLlet Temps d'exclusió per a consum de la llet INT En dies
MEDICAMENTS_DELS_TRACTAMENTS
Atribut Descripció Tipus de dada NULL Observació
idMedicament Codi del medicament CHAR(4) NO Clau externa Clau primària
idTractament Codi del tractament CHAR(4) NO Clau externa
LOGS
Atribut Descripció Tipus de dada NULL Observació
idLog Codi de registre CHAR(4) NO Clau primària
data Data de registre DATETIME NO
contingut Contingut del registre VARCHAR(250) NO

Scripts de prova

Una vegada instal·lat el servidor i creada la base de dades, la importarem a la màquina final per a implantar la base de dades inicial amb unes dades per defecte, si s'escau.

Revisió de casos d'ús per subsistema

Entenem un subsistema com a un procediment per a consultar, inserir o exportar les dades. El funcionament genèric dels procediments funcionarà de la següent manera:

CALL nom_procediment(paràmetres);

D'aquesta manera, nosaltres, com a administradors del SGBD crearem els procediments per a gestionar la informació i l'usuari només haurà d'aprendre el nom dels procediments per a realitzar determinades accions i els seus paràmetres. Això ofereix un nivell d'abstracció de cara a l'usuari que facilita l'aprenentatge i el funcionament sense necessitat d'aprendre a fer consultes complicades; tot i que sempre té l'opció de fer consultes "crues" des de la interfície d'administració de la BBDD.

Requisits d'implantació

Per tal de tirar endavant la implantació en un entorn de proves, necessitarem complir els següents punts:

  • Màquina virtual amb el sistema operatiu CentOS 7 instal·lat [1]
  • MariaDB com a sistema gestor de la base de dades
  • MySQLWorkbench com a entorn gràfic d'administració de MariaDB

Notes

  1. No necessàriament amb interfície gràfica ja que serà un servidor dedicat que controlarem remotament via SSH i MySQLWorkbench per a gestió de MariaDB; de manera que podria ser un server headless

Desenvolupament

Entorn de desenvolupament

L'entorn de desenvolupament usat serà un ordinador amb Ubuntu 16.04.4.
El SGBD serà MariaDB 15.1 i com a entorn per a generar la BBDD de desenvolupament utilitzarem el mateix MySQLWorkbench.

Base de dades

Farem el disseny de la BBDD amb MySQLWorkbench
Disseny.jpg


Exportarem el disseny cap a la BBDD de proves amb el mètode de forward engineer
Disseny1.jpg


Veurem una previsualització de l'script que generarà la nostra BBDD
Disseny2.jpg


Un cop acabat el procediment, tindrem el missatge que tot ha anat correctament
Disseny3.jpg


El contingut de l'script SQL que genera la BBDD d'aquest projecte amb les seves taules i restriccions de clau externa que hem dissenyat mitjançant el WorkBench és el següent
-- MySQL Workbench Forward Engineering

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,ALLOW_INVALID_DATES';

-- -----------------------------------------------------
-- Schema projecte
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema projecte
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `projecte` DEFAULT CHARACTER SET utf8 ;
USE `projecte` ;

-- -----------------------------------------------------
-- Table `projecte`.`animal`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projecte`.`animal` (
  `idAnimal` CHAR(4) NOT NULL,
  `dib` CHAR(20) NOT NULL,
  `dataNaixement` DATE NOT NULL DEFAULT now(),
  PRIMARY KEY (`idAnimal`),
  UNIQUE INDEX `dib_UNIQUE` (`dib` ASC),
  UNIQUE INDEX `idAnimal_UNIQUE` (`idAnimal` ASC))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `projecte`.`medicament`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projecte`.`medicament` (
  `idMedicament` CHAR(4) NOT NULL,
  `descripcio` VARCHAR(45) NOT NULL,
  `stock` INT NOT NULL,
  `dosi` FLOAT(4,2) NOT NULL,
  `tempsEsperaCarn` INT NULL,
  `tempsEsperaLlet` INT NULL,
  PRIMARY KEY (`idMedicament`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `projecte`.`tipusPersona`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projecte`.`tipusPersona` (
  `idTipusPersona` CHAR(4) NOT NULL,
  `descripcio` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`idTipusPersona`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `projecte`.`persona`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projecte`.`persona` (
  `idPersona` CHAR(4) NOT NULL,
  `tipusPersona` CHAR(4) NOT NULL,
  `nom` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`idPersona`),
  INDEX `fk_persona_tipusPersona1_idx` (`tipusPersona` ASC),
  CONSTRAINT `fk_persona_tipusPersona1`
    FOREIGN KEY (`tipusPersona`)
    REFERENCES `projecte`.`tipusPersona` (`idTipusPersona`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `projecte`.`tractament`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projecte`.`tractament` (
  `idTractament` CHAR(4) NOT NULL,
  `descripcio` VARCHAR(45) NOT NULL,
  PRIMARY KEY (`idTractament`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `projecte`.`administracio`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projecte`.`administracio` (
  `idAdministracio` CHAR(4) NOT NULL,
  `idAnimal` CHAR(4) NOT NULL,
  `idPersona` CHAR(4) NOT NULL,
  `idTractament` CHAR(4) NOT NULL,
  `data` DATE NOT NULL DEFAULT now(),
  PRIMARY KEY (`idAdministracio`),
  INDEX `fk_administracio_animal_idx` (`idAnimal` ASC),
  INDEX `fk_administracio_persona1_idx` (`idPersona` ASC),
  INDEX `fk_administracio_tractament1_idx` (`idTractament` ASC),
  CONSTRAINT `fk_administracio_animal`
    FOREIGN KEY (`idAnimal`)
    REFERENCES `projecte`.`animal` (`idAnimal`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE,
  CONSTRAINT `fk_administracio_persona1`
    FOREIGN KEY (`idPersona`)
    REFERENCES `projecte`.`persona` (`idPersona`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE,
  CONSTRAINT `fk_administracio_tractament1`
    FOREIGN KEY (`idTractament`)
    REFERENCES `projecte`.`tractament` (`idTractament`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `projecte`.`medicaments_dels_tractaments`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projecte`.`medicaments_dels_tractaments` (
  `idMedicament` CHAR(4) NOT NULL,
  `idTractament` CHAR(4) NOT NULL,
  PRIMARY KEY (`idMedicament`, `idTractament`),
  INDEX `fk_medicament_has_tractament_tractament1_idx` (`idTractament` ASC),
  INDEX `fk_medicament_has_tractament_medicament1_idx` (`idMedicament` ASC),
  CONSTRAINT `fk_medicament_has_tractament_medicament1`
    FOREIGN KEY (`idMedicament`)
    REFERENCES `projecte`.`medicament` (`idMedicament`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE,
  CONSTRAINT `fk_medicament_has_tractament_tractament1`
    FOREIGN KEY (`idTractament`)
    REFERENCES `projecte`.`tractament` (`idTractament`)
    ON DELETE RESTRICT
    ON UPDATE CASCADE)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `projecte`.`logs`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `projecte`.`logs` (
  `idLog` INT NOT NULL AUTO_INCREMENT,
  `data` DATETIME NOT NULL,
  `contingut` VARCHAR(250) NOT NULL,
  PRIMARY KEY (`idLog`))
ENGINE = InnoDB;


SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Procediments

afegir_animal
Paràmetres: (idAnimal, dib, dataNaixement)
CREATE DEFINER=`root`@`localhost` PROCEDURE `afegir_animal`(in idAnimal CHAR(4), in dib CHAR(20), in dataNaixement DATE)
BEGIN
	DECLARE EXIT HANDLER FOR 1062 SELECT CONCAT("L'animal amb el número ",idAnimal,"o el DIB ",dib,"ja està donat d'alta a la BBDD") AS "ERROR";
    DECLARE EXIT HANDLER FOR 1048 SELECT CONCAT("Tots els camps són obligatoris: número animal, DIB i data de naixement") AS "ERROR";
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT CONCAT("Error desconegut. Reviseu els paràmetres introduïts o contacteu amb l'administrador del sistema") AS "ERROR";
    
    INSERT INTO animals (idAnimal,dib,dataNaixement) VALUES (idAnimal,dib,dataNaixement);
    SELECT CONCAT("L'animal ",idAnimal," amb DIB ", dib," s'ha donat d'alta correctament") AS "CORRECTE";
END
afegir_persona
Paràmetres: (idPersona, tipusPersona, nom)
CREATE DEFINER=`root`@`localhost` PROCEDURE `afegir_persona`(in idPersona CHAR(4), in tipusPersona CHAR(4), in nom VARCHAR(45))
BEGIN
	DECLARE EXIT HANDLER FOR 1062 SELECT CONCAT("La persona amb el codi ",idPersona," ja està donat d'alta a la BBDD") AS "ERROR";
    DECLARE EXIT HANDLER FOR 1048 SELECT CONCAT("Tots els camps són obligatoris: codi persona, tipus persona i nom") AS "ERROR";
    DECLARE EXIT HANDLER FOR 1452 SELECT CONCAT("El tipus de persona ",tipusPersona," ha d'estar donat d'alta prèviament a la taula tipusPersona") AS "ERROR";
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT CONCAT("Error desconegut. Reviseu els paràmetres introduïts o contacteu amb l'administrador del sistema") AS "ERROR";
    
    INSERT INTO persona (idPersona,tipusPersona,nom) VALUES (idPersona,tipusPersona,nom);
    SELECT CONCAT("La persona ",nom," amb codi ", idPersona," s'ha donat d'alta correctament") AS 'CORRECTE';
END
afegir_medicament
Paràmetres: (idMedicament, descripcio, stock, dosi, tempsEsperaCarn, tempsEsperaLlet)
CREATE DEFINER=`root`@`localhost` PROCEDURE `afegir_medicament`(in idMedicament CHAR(4), in descripcio VARCHAR(45), in stock INT(11), in dosi FLOAT(4,2), in tempsEsperaCarn INT(11), in tempsEsperaLlet INT(11))
BEGIN
	DECLARE EXIT HANDLER FOR 1062 SELECT CONCAT("El medicament ",idMedicament," ja està donat d'alta a la BBDD") AS "ERROR";
    DECLARE EXIT HANDLER FOR 1048 SELECT CONCAT("Els camps idMedicament, descripció, stock i dosi són obligatoris") AS "ERROR";
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT CONCAT("Error desconegut. Reviseu els paràmetres introduïts o contacteu amb l'administrador del sistema") AS "ERROR";
     
    INSERT INTO medicament (idMedicament,descripcio,stock,dosi,tempsEsperaCarn,tempsEsperaLlet) VALUES (idMedicament,descripcio,stock,dosi,tempsEsperaCarn,tempsEsperaLlet);
    SELECT CONCAT("El medicament ",idMedicament," => '", descripcio,"' s'ha donat d'alta correctament amb un stock inicial de ",stock) AS "CORRECTE";
END
afegir_tractament
Paràmetres: (idTractament, descripcio)
CREATE DEFINER=`root`@`localhost` PROCEDURE `afegir_tractament`(in idTractament CHAR(4), in descripcio VARCHAR(45))
BEGIN
	DECLARE EXIT HANDLER FOR 1062 SELECT CONCAT("El tractament ",idTractament," ja està donat d'alta a la BBDD") AS "ERROR";
    DECLARE EXIT HANDLER FOR 1048 SELECT CONCAT("Els camps idTractament, i descripció són obligatoris") AS "ERROR";
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT CONCAT("Error desconegut. Reviseu els paràmetres introduïts o contacteu amb l'administrador del sistema") AS "ERROR";
     
    INSERT INTO medicament (idMedicament,descripcio,stock,dosi,tempsEsperaCarn,tempsEsperaLlet) VALUES (idMedicament,descripcio,stock,dosi,tempsEsperaCarn,tempsEsperaLlet);
    SELECT CONCAT("El tractament ",idTractament," => '", descripcio,"' s'ha donat d'alta correctament.") AS "CORRECTE";
END
afegir_tipusPersona
Paràmetres: (idTipusPersona, descripcio)
CREATE DEFINER=`root`@`localhost` PROCEDURE `afegir_tipusPersona`(in idTipusPersona CHAR(4), in descripcio VARCHAR(45))
BEGIN
	DECLARE EXIT HANDLER FOR 1062 SELECT CONCAT("El tipus de persona ",idTipusPersona," ja està donat d'alta a la BBDD") AS "ERROR";
    DECLARE EXIT HANDLER FOR 1048 SELECT CONCAT("Els camps idTipusPersona i descripció són obligatoris") AS "ERROR";
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT CONCAT("Error desconegut. Reviseu els paràmetres introduïts o contacteu amb l'administrador del sistema") AS "ERROR";
     
    INSERT INTO tipusPersona (idTipusPersona,descripcio) VALUES (idTipusPersona,descripcio);
    SELECT CONCAT("La persona ",idTipusPersona," => '", descripcio,"' s'ha donat d'alta correctament.") AS "CORRECTE";
END
afegir_medicament_a_tractament
Paràmetres: (idTractament, idMedicament)
CREATE DEFINER=`root`@`localhost` PROCEDURE `afegir_medicament_a_tractament`(in idTractament CHAR(4), in idMedicament CHAR(4), in nom VARCHAR(45))
BEGIN
	DECLARE EXIT HANDLER FOR 1062 SELECT CONCAT("El medicament ",idMedicament," assignat al tractament ",idTractament," ja està donat d'alta a la BBDD") AS "ERROR";
    DECLARE EXIT HANDLER FOR 1048 SELECT CONCAT("Tots els camps són obligatoris: codi tractament i codi medicament") AS "ERROR";
    DECLARE EXIT HANDLER FOR 1452 SELECT CONCAT("El medicament ",idMedicament," i el tractament ",idTractament," han d'estar donats d'alta prèviament a la taula medicament i tractament respectivament") AS "ERROR";
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT CONCAT("Error desconegut. Reviseu els paràmetres introduïts o contacteu amb l'administrador del sistema") AS "ERROR";
    
    INSERT INTO medicaments_dels_tractaments (idMedicament,idTractament) VALUES (idMedicament,idTractament);
    SELECT CONCAT("El medicament ",idMedicament," s'ha vinculat correctament al tractament ", idTractament) AS "CORRECTE";
END
afegir_administracio
Paràmetres: (idAnimal, idPersona, idTractament, data)
CREATE DEFINER=`root`@`localhost` PROCEDURE `afegir_administracio`(IN idAnimal CHAR(4), IN idPersona CHAR(4), IN idTractament CHAR(4), IN data DATE)
BEGIN
	DECLARE EXIT HANDLER FOR 1048 SELECT CONCAT("Tots els camps són obligatoris: Codi Animal, Codi Persona, Codi Tractament i Data") AS "ERROR";
    DECLARE EXIT HANDLER FOR 1452 SELECT CONCAT("La persona ",idPersona,", l'animal ",idAnimal," i el tractament ",idTractament," han d'estar donats d'alta prèviament a la taula persona i tractament respectivament") AS "ERROR";
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT CONCAT("Error desconegut. Reviseu els paràmetres introduïts o contacteu amb l'administrador del sistema") AS "ERROR";
    
    INSERT INTO administracio (idAnimal,idPersona,idTractament,data) VALUES (idAnimal,idPersona,idTractament,data);
    SELECT CONCAT("L'administració a l'animal ",idAnimal," s'ha registrat correctament per a l'usuari ", idUsuari) AS "CORRECTE";
END

Disparadors

Els disparadors em permetran mantenir un cert registre dels canvis que es fan a la BBDD: en aquest projecte faré només triggers per a inserció de dades a les taules per a desar la informació convenient a la taula de logs.

Taula administracio
CREATE DEFINER = `root`@`localhost` TRIGGER `projecte`.`administracio_AFTER_INSERT` AFTER INSERT ON `administracio` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut) VALUES (CONCAT("La persona ",new.idPersona, " ha administrat un medicament pel tractament ",new.idTractament," a l'animal ",new.idAnimal," amb data ",new.data));
END
Taula animal
CREATE DEFINER=`root`@`localhost` TRIGGER `projecte`.`animal_AFTER_INSERT` AFTER INSERT ON `animal` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut) VALUES (CONCAT("S'ha donat d'alta un nou animal nascut el ",new.dataNaixement," amb el DIB ",new.dib," i ID ",new.idAnimal));
END
Taula medicament
CREATE DEFINER=`root`@`localhost` TRIGGER `projecte`.`medicament_AFTER_INSERT` AFTER INSERT ON `medicament` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut) VALUES (CONCAT("S'ha afegit un nou medicament: ",new.descripcio," amb codi ",new.idMedicament," amb un stock de ",new.stock," dosis"));
END
Taula medicaments_dels_tractaments
CREATE DEFINER=`root`@`localhost` TRIGGER `projecte`.`medicaments_dels_tractaments_AFTER_INSERT` AFTER INSERT ON `medicaments_dels_tractaments` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut) VALUES (CONCAT("S'ha relacionat el medicament ",new.idMedicament," amb el tractament ",new.idTractament));
END
Taula persona
CREATE DEFINER=`root`@`localhost` TRIGGER `projecte`.`persona_AFTER_INSERT` AFTER INSERT ON `persona` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut) VALUES (CONCAT("S'ha donat d'alta una nova persona ",new.tipusPersona," amb codi ", new.idPersona,"i nom ",new.nom));
END
Taula tipusPersona
CREATE DEFINER=`root`@`localhost` TRIGGER `projecte`.`tipusPersona_AFTER_INSERT` AFTER INSERT ON `tipusPersona` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut) VALUES (CONCAT("S'ha donat d'alta un nou tipus de persona ",new.descripcio," amb el codi ",new.idTipusPersona));
END
Taula tractament
CREATE DEFINER=`root`@`localhost` TRIGGER `projecte`.`tractament_AFTER_INSERT` AFTER INSERT ON `tractament` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut) VALUES (CONCAT("S'ha afegit un nou tractament per a la malaltia ",new.descripcio," amb el codi ",new.idTractament));
END

Exportació

He dissenyat un procediment per a exportar en arxiu .txt l'historial de diagnòstic dels animals per a poder llistar tots els tractaments que s'han fet per a cada animal

CREATE DEFINER=`root`@`localhost` PROCEDURE `exportar_malalties_animals`()
BEGIN
	DECLARE finalAnimals INT DEFAULT FALSE;
    DECLARE animal CHAR(10);
    DECLARE cAnimal CURSOR FOR
		SELECT idAnimal FROM animal ORDER BY dataNaixement;
    
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET finalAnimals = TRUE;
    DECLARE EXIT HANDLER FOR 1086 SELECT CONCAT("L'arxiu ja existeix, elimina primer o canvia el nom i torna a executar el procediment") AS 'ERROR';
    DECLARE EXIT HANDLER FOR 1 SELECT CONCAT("La ruta no existeix o bé no hi tinc permisos descriptura") AS 'ERROR';
    DECLARE EXIT HANDLER FOR SQLEXCEPTION SELECT CONCAT("Error desconegut. Contacteu amb l'administrador del sistema per a intentar resoldre-ho") AS 'ERROR';
    
    
    
    DROP TABLE IF EXISTS tempAnimals;
    CREATE TABLE tempAnimals (camp VARCHAR(250));
    
    OPEN cAnimal;
    bucleAnimal:LOOP
		FETCH cAnimal INTO animal;
			IF finalAnimals THEN LEAVE bucleAnimal; END IF;
        
        blocTractament:BEGIN
			DECLARE finalTractament INT DEFAULT FALSE;
            DECLARE descTractament CHAR(10);
            DECLARE contTractament INT;
            DECLARE tractamentAct INT DEFAULT 1;
            DECLARE caracter CHAR;
            DECLARE cTractament CURSOR FOR            
				SELECT tractament.descripcio FROM administracio NATURAL JOIN tractament WHERE idAnimal=animal;
            
            DECLARE CONTINUE HANDLER FOR NOT FOUND SET finalTractament = TRUE;
            
            INSERT INTO tempAnimals VALUES (CONCAT(animal,' ┐'));
            
            SELECT COUNT(*) descripcio FROM administracio NATURAL JOIN tractament WHERE idAnimal=animal INTO contTractament;
            
            OPEN cTractament;
			bucleTractament:LOOP
            
            SET tractamentAct=tractamentAct+1;
				
                FETCH cTractament INTO descTractament;
					IF finalTractament THEN LEAVE bucleTractament; END IF;
                
                IF tractamentAct=contTractament THEN 
					SET caracter='├'; 
                ELSE
					SET caracter='└';
                 END IF;

                INSERT INTO tempAnimals VALUES(CONCAT(SPACE(LENGTH(animal)+1), caracter, descTractament));
			
				ITERATE bucleTractament;
			
            CLOSE cTractament;
			END LOOP bucleTractament;
		END blocTractament;
        ITERATE bucleAnimal;
        CLOSE cAnimal;
        
	END LOOP bucleAnimal;
    
    SELECT camp  AS 'DADES EXPORTADES' FROM tempAnimals;
    
    SELECT camp FROM tempAnimals INTO OUTFILE "/dades/export/projecte.txt" LINES TERMINATED BY '\n';
    
    SELECT CONCAT("/dades/export/projecte.txt exportat correctament") AS 'CORRECTE';
END

Documentació

En aquest projecte no és necessària una extensa documentació ja que al client se li farà una formació bàsica per aprendre com funcionen els procediments. A mida que vagi avançant, potser serà necessari realitzar un document de funcionament però de moment, crec que se'n pot prescindir.

Implementació

A la màquina de treball del client se li instal·larà la versió apta per al sistema operatiu del programa MySQLWorkbench. Serà el programa que permetrà interactuar amb la màquina virtual que serà el servidor de la base de dades.

Màquina virtual amb CentOS 7

Instal·larem VirtualBox a l'ordinador del client i crearem una màquina virtual CentOS 7 tal com s'explica en l'apartat annexos.

Importació

Tota la base de dades, incloent els procediments, triggers i dades d'exemple per a fer una demostració definits en apartats anteriors es pot restaurar mitjançant el següent arxiu SQL amb la comanda

mysqldump -u root -p projecte <nom_BBDD_restaurada> < <nom_arxiu_sql> 
-- MySQL dump 10.16  Distrib 10.2.7-MariaDB, for debian-linux-gnu (x86_64)
--
-- Host: localhost    Database: projecte
-- ------------------------------------------------------
-- Server version	10.2.7-MariaDB-10.2.7+maria~xenial

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARACTER_SET_RESULTS */;
/*!40101 SET @OLD_COLLATION_CONNECTION=@@COLLATION_CONNECTION */;
/*!40101 SET NAMES utf8mb4 */;
/*!40103 SET @OLD_TIME_ZONE=@@TIME_ZONE */;
/*!40103 SET TIME_ZONE='+00:00' */;
/*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
/*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
/*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
/*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;

CREATE SCHEMA IF NOT EXISTS `projecte` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci ;
USE `projecte` 

--
-- Table structure for table `administracio`
--

DROP TABLE IF EXISTS `administracio`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `administracio` (
  `idAdministracio` char(4) NOT NULL,
  `idAnimal` char(4) NOT NULL,
  `idPersona` char(4) NOT NULL,
  `idTractament` char(4) NOT NULL,
  `data` date NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`idAdministracio`),
  KEY `fk_administracio_animal_idx` (`idAnimal`),
  KEY `fk_administracio_persona1_idx` (`idPersona`),
  KEY `fk_administracio_tractament1_idx` (`idTractament`),
  CONSTRAINT `fk_administracio_animal` FOREIGN KEY (`idAnimal`) REFERENCES `animal` (`idAnimal`) ON UPDATE CASCADE,
  CONSTRAINT `fk_administracio_persona1` FOREIGN KEY (`idPersona`) REFERENCES `persona` (`idPersona`) ON UPDATE CASCADE,
  CONSTRAINT `fk_administracio_tractament1` FOREIGN KEY (`idTractament`) REFERENCES `tractament` (`idTractament`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `administracio`
--

LOCK TABLES `administracio` WRITE;
/*!40000 ALTER TABLE `administracio` DISABLE KEYS */;
INSERT INTO `administracio` VALUES ('1','200','1111','T002','2018-03-17'),('2','201','1111','T002','2018-03-17'),('3','200','1111','T001','2018-03-17');
/*!40000 ALTER TABLE `administracio` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection  = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `projecte`.`administracio_AFTER_INSERT` AFTER INSERT ON `administracio` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut,data) VALUES (CONCAT("La persona ",new.idPersona, " ha administrat un medicament pel tractament ",new.idTractament," a l'animal ",new.idAnimal," amb data ",new.data),now());
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;

--
-- Table structure for table `animal`
--

DROP TABLE IF EXISTS `animal`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `animal` (
  `idAnimal` char(4) NOT NULL,
  `dib` char(20) NOT NULL,
  `dataNaixement` date NOT NULL DEFAULT current_timestamp(),
  PRIMARY KEY (`idAnimal`),
  UNIQUE KEY `dib_UNIQUE` (`dib`),
  UNIQUE KEY `idAnimal_UNIQUE` (`idAnimal`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `animal`
--

LOCK TABLES `animal` WRITE;
/*!40000 ALTER TABLE `animal` DISABLE KEYS */;
INSERT INTO `animal` VALUES ('200','1234567890','2018-03-19'),('201','0987654321','2018-03-20');
/*!40000 ALTER TABLE `animal` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection  = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `projecte`.`animal_AFTER_INSERT` AFTER INSERT ON `animal` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut,data) VALUES (CONCAT("S'ha donat d'alta un nou animal nascut el ",new.dataNaixement," amb el DIB ",new.dib," i ID ",new.idAnimal),now());
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;

--
-- Table structure for table `logs`
--

DROP TABLE IF EXISTS `logs`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `logs` (
  `idLog` int(11) NOT NULL AUTO_INCREMENT,
  `data` datetime NOT NULL,
  `contingut` varchar(250) NOT NULL,
  PRIMARY KEY (`idLog`)
) ENGINE=InnoDB AUTO_INCREMENT=14 DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `logs`
--

LOCK TABLES `logs` WRITE;
/*!40000 ALTER TABLE `logs` DISABLE KEYS */;
INSERT INTO `logs` VALUES (1,'2018-03-19 11:57:51','S\'ha afegit un nou tractament per a la malaltia Coixera amb el codi T001'),(2,'2018-03-19 11:58:07','S\'ha afegit un nou medicament: Mamitis amb codi  amb un stock de 0 dosis'),(3,'2018-03-19 11:58:53','S\'ha afegit un nou tractament per a la malaltia Mamitis amb el codi T002'),(4,'2018-03-19 12:01:59','S\'ha donat d\'alta un nou animal nascut el 2018-03-19 amb el DIB 1234567890 i ID 200'),(5,'2018-03-19 12:02:33','S\'ha donat d\'alta un nou animal nascut el 2018-03-20 amb el DIB 0987654321 i ID 201'),(6,'2018-03-19 12:04:01','S\'ha afegit un nou medicament: Medicament1 amb codi M001 amb un stock de 10 dosis'),(7,'2018-03-19 12:04:08','S\'ha afegit un nou medicament: Medicament2 amb codi M002 amb un stock de 10 dosis'),(8,'2018-03-19 12:04:13','S\'ha afegit un nou medicament: Medicament3 amb codi M003 amb un stock de 10 dosis'),(9,'2018-03-19 12:06:49','S\'ha relacionat el medicament M001 amb el tractament T001'),(10,'2018-03-19 12:06:54','S\'ha relacionat el medicament M002 amb el tractament T001'),(11,'2018-03-19 12:08:38','La persona 1111 ha administrat un medicament pel tractament T001 a l\'animal 200 amb data 2018-03-17'),(12,'2018-03-19 12:09:12','La persona 1111 ha administrat un medicament pel tractament T002 a l\'animal 200 amb data 2018-03-17'),(13,'2018-03-19 12:09:16','La persona 1111 ha administrat un medicament pel tractament T002 a l\'animal 200 amb data 2018-03-17');
/*!40000 ALTER TABLE `logs` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `medicament`
--

DROP TABLE IF EXISTS `medicament`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `medicament` (
  `idMedicament` char(4) NOT NULL,
  `descripcio` varchar(45) NOT NULL,
  `stock` int(11) NOT NULL,
  `dosi` float(4,2) NOT NULL,
  `tempsEsperaCarn` int(11) DEFAULT NULL,
  `tempsEsperaLlet` int(11) DEFAULT NULL,
  PRIMARY KEY (`idMedicament`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `medicament`
--

LOCK TABLES `medicament` WRITE;
/*!40000 ALTER TABLE `medicament` DISABLE KEYS */;
INSERT INTO `medicament` VALUES ('','Mamitis',0,0.00,NULL,NULL),('M001','Medicament1',10,0.50,NULL,NULL),('M002','Medicament2',10,0.50,NULL,NULL),('M003','Medicament3',10,0.50,NULL,NULL),('M01','Medicament 1',10,0.50,NULL,NULL),('M02','Medicament 2',10,0.50,NULL,NULL),('M03','Medicament 3',20,0.50,NULL,NULL),('M04','Medicament 4',20,0.50,NULL,NULL);
/*!40000 ALTER TABLE `medicament` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection  = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `projecte`.`medicament_AFTER_INSERT` AFTER INSERT ON `medicament` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut,data) VALUES (CONCAT("S'ha afegit un nou medicament: ",new.descripcio," amb codi ",new.idMedicament," amb un stock de ",new.stock," dosis"),now());
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;

--
-- Table structure for table `medicaments_dels_tractaments`
--

DROP TABLE IF EXISTS `medicaments_dels_tractaments`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `medicaments_dels_tractaments` (
  `idMedicament` char(4) NOT NULL,
  `idTractament` char(4) NOT NULL,
  PRIMARY KEY (`idMedicament`,`idTractament`),
  KEY `fk_medicament_has_tractament_tractament1_idx` (`idTractament`),
  KEY `fk_medicament_has_tractament_medicament1_idx` (`idMedicament`),
  CONSTRAINT `fk_medicament_has_tractament_medicament1` FOREIGN KEY (`idMedicament`) REFERENCES `medicament` (`idMedicament`) ON UPDATE CASCADE,
  CONSTRAINT `fk_medicament_has_tractament_tractament1` FOREIGN KEY (`idTractament`) REFERENCES `tractament` (`idTractament`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `medicaments_dels_tractaments`
--

LOCK TABLES `medicaments_dels_tractaments` WRITE;
/*!40000 ALTER TABLE `medicaments_dels_tractaments` DISABLE KEYS */;
INSERT INTO `medicaments_dels_tractaments` VALUES ('M001','T001'),('M002','T001');
/*!40000 ALTER TABLE `medicaments_dels_tractaments` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection  = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `projecte`.`medicaments_dels_tractaments_AFTER_INSERT` AFTER INSERT ON `medicaments_dels_tractaments` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut,data) VALUES (CONCAT("S'ha relacionat el medicament ",new.idMedicament," amb el tractament ",new.idTractament),now());
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;

--
-- Table structure for table `persona`
--

DROP TABLE IF EXISTS `persona`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `persona` (
  `idPersona` char(4) NOT NULL,
  `tipusPersona` char(4) NOT NULL,
  `nom` varchar(45) NOT NULL,
  PRIMARY KEY (`idPersona`),
  KEY `fk_persona_tipusPersona1_idx` (`tipusPersona`),
  CONSTRAINT `fk_persona_tipusPersona1` FOREIGN KEY (`tipusPersona`) REFERENCES `tipusPersona` (`idTipusPersona`) ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `persona`
--

LOCK TABLES `persona` WRITE;
/*!40000 ALTER TABLE `persona` DISABLE KEYS */;
INSERT INTO `persona` VALUES ('1111','2','Francesc Solà'),('1234','1','Guillem Solà'),('2222','3','Genèric');
/*!40000 ALTER TABLE `persona` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection  = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `projecte`.`persona_AFTER_INSERT` AFTER INSERT ON `persona` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut,data) VALUES (CONCAT("S'ha donat d'alta una nova persona ",new.tipusPersona," amb codi ", new.idPersona,"i nom ",new.nom),now());
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;

--
-- Table structure for table `tempAnimals`
--

DROP TABLE IF EXISTS `tempAnimals`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tempAnimals` (
  `camp` varchar(250) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `tempAnimals`
--

LOCK TABLES `tempAnimals` WRITE;
/*!40000 ALTER TABLE `tempAnimals` DISABLE KEYS */;
INSERT INTO `tempAnimals` VALUES ('200 ┐'),('    ├Coixera'),('    └Mamitis'),('201 ┐'),('    └Mamitis');
/*!40000 ALTER TABLE `tempAnimals` ENABLE KEYS */;
UNLOCK TABLES;

--
-- Table structure for table `tipusPersona`
--

DROP TABLE IF EXISTS `tipusPersona`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tipusPersona` (
  `idTipusPersona` char(4) NOT NULL,
  `descripcio` varchar(45) NOT NULL,
  PRIMARY KEY (`idTipusPersona`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `tipusPersona`
--

LOCK TABLES `tipusPersona` WRITE;
/*!40000 ALTER TABLE `tipusPersona` DISABLE KEYS */;
INSERT INTO `tipusPersona` VALUES ('1','Ramader'),('2','Veterinari'),('3','Treballador');
/*!40000 ALTER TABLE `tipusPersona` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection  = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `projecte`.`tipusPersona_AFTER_INSERT` AFTER INSERT ON `tipusPersona` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut,data) VALUES (CONCAT("S'ha donat d'alta un nou tipus de persona ",new.descripcio," amb el codi ",new.idTipusPersona),now());
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;

--
-- Table structure for table `tractament`
--

DROP TABLE IF EXISTS `tractament`;
/*!40101 SET @saved_cs_client     = @@character_set_client */;
/*!40101 SET character_set_client = utf8 */;
CREATE TABLE `tractament` (
  `idTractament` char(4) NOT NULL,
  `descripcio` varchar(45) NOT NULL,
  PRIMARY KEY (`idTractament`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
/*!40101 SET character_set_client = @saved_cs_client */;

--
-- Dumping data for table `tractament`
--

LOCK TABLES `tractament` WRITE;
/*!40000 ALTER TABLE `tractament` DISABLE KEYS */;
INSERT INTO `tractament` VALUES ('T001','Coixera'),('T002','Mamitis');
/*!40000 ALTER TABLE `tractament` ENABLE KEYS */;
UNLOCK TABLES;
/*!50003 SET @saved_cs_client      = @@character_set_client */ ;
/*!50003 SET @saved_cs_results     = @@character_set_results */ ;
/*!50003 SET @saved_col_connection = @@collation_connection */ ;
/*!50003 SET character_set_client  = utf8 */ ;
/*!50003 SET character_set_results = utf8 */ ;
/*!50003 SET collation_connection  = utf8_general_ci */ ;
/*!50003 SET @saved_sql_mode       = @@sql_mode */ ;
/*!50003 SET sql_mode              = 'STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' */ ;
DELIMITER ;;
/*!50003 CREATE*/ /*!50017 DEFINER=`root`@`localhost`*/ /*!50003 TRIGGER `projecte`.`tractament_AFTER_INSERT` AFTER INSERT ON `tractament` FOR EACH ROW
BEGIN
	INSERT INTO logs (contingut,data) VALUES (CONCAT("S'ha afegit un nou tractament per a la malaltia ",new.descripcio," amb el codi ",new.idTractament),now());
END */;;
DELIMITER ;
/*!50003 SET sql_mode              = @saved_sql_mode */ ;
/*!50003 SET character_set_client  = @saved_cs_client */ ;
/*!50003 SET character_set_results = @saved_cs_results */ ;
/*!50003 SET collation_connection  = @saved_col_connection */ ;
/*!40103 SET TIME_ZONE=@OLD_TIME_ZONE */;

/*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
/*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
/*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
/*!40101 SET CHARACTER_SET_CLIENT=@OLD_CHARACTER_SET_CLIENT */;
/*!40101 SET CHARACTER_SET_RESULTS=@OLD_CHARACTER_SET_RESULTS */;
/*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */;
/*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;

-- Dump completed on 2018-03-19 13:04:51

Usuari

Crearé un usuari administrador per a aquesta base de dades que tingui tots els permisos amb la comanda següent dins la consola de mysql

GRANT ALL ON projecte.* TO administrador@'%' IDENTIFIED BY 'P@sSw0rD' 

Configuració del MySQLWorkbench

Afegirem la connexió a l'equip del client on hem instal·lat el MySQLWorkbench fent servir la guia de l'annex

Annexos

Instal·lació de VirtualBox

Descàrrega

Pas 1

Per a descarregar VirtualBox haurem d'anar a la pàgina oficial de l'aplicació i fer clic a l'enllaç de la línia inferior per anar-hi. Pàgina web oficial: https://www.virtualbox.org/

Una vegada ens trobem a la pàgina de l'aplicació, podrem observar un requadre de color blau amb el missatge "Download VirtualBox". Podem veure'l ressaltat a la imatge inferior amb una fletxa de color taronja.

Install VB.png
Pas 2

En fer clic en el requadre ens portarà a una nova pàgina, on haurem de seleccionar per a quin sistema operatiu volem l'aplicació, en el nostre cas com descarregarem la versió per a Windows, ja que l'equip host del client és Windows. Farem clic al damunt del text "Windows Hosts".

Install VB 2.png

Instal·lació

Pas 1

Una vegada ja hàgim descarregat l'aplicació, anirem a la carpeta on l'hem descarregat i hi farem doble clic. Ens apareixerà una finestra emergent que ens donarà la benvinguda a la instal·lació. Clicarem el botó "Next >".

Install VB 3.png
Pas 2

En aquesta finestra podrem canviar la ubicació on s'instal·larà l'aplicació. Deixarem l'opció per defecte; buscarem el botó "Next >" i hi farem clic.

Install VB 4.png
Pas 3

Aquí se'ns permetrà seleccionar diverses opcions a l'hora de crear els accessos directes (si volem que es creïn a la barra de tasques, a l'escriptori, etc.). Deixarem les opcions per defecte i farem clic al botó "Next >"

Install VB 5.png
Pas 4

S'informa que les connexions quedaran desactivades per uns instants, ja que VirtualBox estarà creant noves interfícies de xarxa virtual. Farem clic al el botó "Yes".

Install VB 6.png
Pas 5

Demanarà una confirmació per a començar la instal·lació; farem clic a "Install".

Install VB 7.png
Pas 6

Haurem de configurar la instal·lació com a administració fent clic al botó "Sí".

Install VB 8.png
Pas 7

Esperarem mentre es realitza la instal·lació.

Install VB 9.png
Pas 8

Acabarem la instal·lació fent clic a "Finish".

Install VB 10.png

Crear una màquina virtual

Pas 1

Haurem d'obrir el programa Virtualbox tal com s'ha definit a l'apartat anterior d'aquest annex. Una vegada l'obrim, tindrem aquesta interfície:

VM1.jpg
Pas 2

Farem clic a la part superior esquerra al botó Nova

VM2.jpg
Pas 3

Triarem un nom identificatiu per a la màquina virtual i escollirem el sistema operatiu convidat de la màquina. En el nostre cas, triarem Red Hat 64bit perquè CentOS està basat en Red Hat i VirtualBox així ho entén.

S'ha produït un error en crear la miniatura: No es pot desar la miniatura a la destinació
Pas 4

A la següent pantalla triarem la quantitat de memòria RAM que tindrà la màquina convidada. Pel nostre projecte, podem passar de moment amb 2GiB, de manera que escriurem 2048 MB al requadre o desplaçarem el cursor fins arribar a aquesta quantitat. En el cas que el projecte avanci i veiguem que hem fet curt, sempre podrem apagar la màquina i ampliar aquesta memòria; sempre i quan en tinguem suficient de disponible a la màquina física.

S'ha produït un error en crear la miniatura: No es pot desar la miniatura a la destinació
Pas 5

Pel que fa al tamany del disc dur, VirtualBox suggereix una mida de 8 GB, de manera que per a no fer curt, escollirem 10 GB. Més endavant també podríem afegir un altre disc virtual de tipus VDI per a afegir més espai d'emmagatematge. Si a l'hora d'instal·lar el sistema ho fem en un sistema LVM, podrem ampliar capacitat amb un altre disc sense gaire dificultat. Passarem al següent pas.

S'ha produït un error en crear la miniatura: No es pot desar la miniatura a la destinació
Pas 6

Finalment, ja tindrem la màquina nova al nostre catàleg. De moment és una màquina amb un disc dur de 10GB, amb 2GiB de RAM i 1 CPU.

VM6.jpg
Pas 7

Per a anar sobresegurs en tema de multitasking, afegirem un altre nucli de CPU disponible a la màquina des del botó de Paràmetres.

VM7.jpg
Pas 8

A la pestanya Processador de l'apartat Sistema del menú de l'esquerra col·locarem el cursor de Processador(s) cap a 2. D'aquesta manera, la màquina virtual tindrà més coll per a poder fer multitasca si hi ha moltes connexions simultànies o bé tenim l'administrador fent manteniment d'actualitzacions i hem de permetre un bon rendiment per la part del servidor MariaDB. Quan haguem finalitzat, desarem els canvis.

VM8.jpg

Instal·lació de CentOS 7

Pas 1

Haurem de descarregar una imatge de disc ISO de l'última versió de CentOS disponible. A data de publicació d'aquesta pàgina, CentOS 7 és l'últim stable release. Anirem a la web de CentOS Project (https://www.centos.org/download/) i farem clic a Minimal ISO per a descarregar l'arxiu:

Centos1.jpg
Pas 2

Farem clic al servidor des del que volguem descarregar la ISO. Per defecte se'ns ensenyen els servidors més propers a la nostra localització, de manera que la descàrrega hauria de ser més ràpida. Qualsevol enlla ens serviria; jo he escollit el primer

Centos2.jpg
Pas 3

Triarem una ubicació coneguda per a desar-hi l'arxiu descarregat amb suficient espai, perquè més endavant haurem de recuperar aquesta imatge per a fer la instal·lació a la màquina virtual creada a l'apartat annex anterior.

Centos3.jpg
Pas 4

Ara és moment de començar la instal·lació del sistema operatiu sobre la màquina virtual. Obrirem de nou el programa VirtualBox i entrarem als paràmetres de la màquina virtual creada abans. Anirem a l'apartat Emmagatzematge' i farem clic a la unitat de CD/DVD virtual

Centos4.jpg
Pas 5

Escollirem la ISO que volem muntar com a DVD virtual des del desplegable de la dreta:

Centos5.jpg
Pas 6

Ara ja tenim la màquina virtual amb un DVD de Centos 7 inserit a la unitat lectora de CD/DVD virtual.

Centos6.jpg
Pas 7

Ara ja podrem arrencar la màquina fent doble clic sobre l'entrada corresponent del catàleg, amb l'opció Inicia que hi ha a dalt o bé fent clic dret i seleccionant l'opció pertinent.

Centos7.jpg
Pas 8

La màquina arrencarà i bootejarà des del DVD virtual. Ens apareixerà aquesta pantalla inicialment. Escollirem la primera opció marcant-la amb les tecles de desplaçament i apretarem la tecla de enter

S'ha produït un error en crear la miniatura: No es pot desar la miniatura a la destinació
Pas 9

El sistema començarà a carregar. Esperarem fins que ens aparegui la pantalla d'instal·lació pròpiament dita

Centos9.jpg
Pas 10

A la primera pantalla escollirem l'idioma durant la instal·lació per a definir la distribució del teclat correcta

Centos10.jpg
Pas 11

Escollirem el disc on instal·lar el sistema. En el nostre cas només hi tenim un sol disc; però en cas que tinguem més d'un disc connectat a la màquina, hauríem de saber quin volem fer servir pel sistema i quin no; per tal d'evitar errors

Centos11.jpg
Pas 12

També definirem els paràmetres de l'adaptador de xarxa de manera que la màquina es pugui comunicar per xarxa a través d'aquesta interfície.

Centos12.png
Pas 13

Revisarem els paràmetres d'instal·lació: si tot és correcte, passarem a la següent pantalla per a començar la instal·lació

Centos13.jpg
Pas 14

Mentre va fent la instal·lació, definirem una contrasenya per a l'usuari root del sistema

Centos14.jpg
Pas 15

També podem definir un altre usuari no root que sigui administrador del sistema. Jo, per exemple, n'he creat un amb nom administrador que tindrà rol d'administrador amb una contrasenya. De manera que per a fer tasques administratives a la màquina, no haguem d'accedir com a root per a blindar més el sistema a nivell de seguretat.

Centos15.jpg
Pas 16

Una vegada completat el procés d'instal·lació, reiniciarem el sistema

Centos161.jpg
Pas 17

La nova instal·lació arrencarà el CentOS 7 des del disc dur

Centos171.jpg
Pas 18

Podrem accedir per terminal a la màquina recent instal·lada

Centos181.jpg

Crear la connexió amb MySQL Workbench

Pas 1

Executarem el programa MySQLWorkbench i tindrem aquesta finestra principal

WB1.jpg
Pas 2

Farem clic al botó + del costat de l'etiqueta MySQL Connections i introduirem les dades d'accés al servidor MariaDB que hem configurat a la màquina virtual. En aquest cas suposaré que s'ha definit una entrada nova al DNS local que mapeja el domini bbddprojecte a l'adreça IP corresponent de la màquina virtual per a simplificar.

WB2.jpg
Pas 3

Si tot és correcte i desem aquesta connexió, retornarem a la pàgina principal però ara hi veurem un requadre nou amb la informació de la connexió que hem desat abans. Per a connectar-nos, doncs, només haurem de fer clic al requadre i desestimar un avís de possible incompatibilitat entre el programa i el servidor MariaDB.

WB3.jpg
Pas 4

Si la connexió és correcta, ens connectarem al servidor de BBDD i per defecte se'ns mostrarà l'editor SQL des d'on el client administrador o encarregat del sistema podrà executar els procediments definits en els altres apartats per a interactuar amb la base de dades.

WB4.jpg