Bonjour François,
Envoyé par
fsmrel
Me suis-je fourvoyé ? Sommes-nous encore en phase ?
Nous sommes encore en phase sur certains points.
Envoyé par
fsmrel
Supposons que la classe CL2 soit attachée à la fonction F1 et que le groupe G2 soit attaché à F1.
La règle générale c'est qu'un élément donné de la classification ne peut pas contenir des entités de types différents.
Détaillons les différentes règles de gestion.
ECHELON
(R1) Un échelon est directement rattaché soit à une classe, soit à un groupe.
(R2) Si un groupe est directement rattaché à une classe, alors aucun échelon ne peut être directement rattaché à cette classe.
NB: un groupe peut regrouper des échelons et non l'inverse
.
(R3) Si un échelon est directement rattaché à une classe, alors aucun groupe ne peut être rattaché à cette classe (directement ou indirectement).
NB : Une classe à laquelle un échelon peut directement faire référence n'admet pas de groupes.
GROUPE
(R4) Un groupe est directement rattaché soit à une classe, soit à une fonction.
(R5) Si une classe est directement rattachée à une fonction, alors aucun groupe ne peut être directement rattaché à cette fonction.
NB : une classe peut contenir des groupes et non l'inverse.
(R6) Si un groupe est directement rattaché à une fonction, alors aucune classe ne peut être rattachée à cette fonction (directement ou indirectement).
NB : une fonction a laquelle un groupe peut directement faire référence n'admet pas de classes.
CLASSE
(R7) Une classe est directement rattachée soit à une fonction, soit à un corps.
(R8) Si une fonction est directement rattachée à un corps, alors aucune classe ne peut être directement rattachée à ce corps.
NB : une fonction peut contenir des classes et non l'inverse.
(R9) Si une classe est directement rattachée à un corps, alors aucune fonction ne peut être rattachée à ce corps (directement ou indirectement).
NB : un corps auquel une classe peut directement faire référence n'admet pas de fonctions.
FONCTION
(R10)Une fonction est directement rattachée soit à un collège, soit à un corps.
(R11)Si un collège est directement à un corps, alors aucune fonction ne peut être directement rattachée à ce corps
NB : un collège peut contenir des fonctions et non l'inverse.
(R12)Si une fonction est directement rattaché à un corps, alors aucun collège ne peut être rattaché à ce corps (directement ou indirectement).
NB : un corps auquel une fonction peut directement faire référence n'admet pas de collège.
Voici les différents triggers que j'en ai déduit. J'ai travaillé avec MySQL Workbench.
ECHELON_CLASSE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE TRIGGER `fichier`.`ECHELON_CLASSE_BEFORE_INSERT` BEFORE INSERT ON `ECHELON_CLASSE` FOR EACH ROW
BEGIN
SET @N = (
SELECT COUNT(*)
FROM ECHELON_GROUPE
WHERE EchelonId = NEW.EchelonId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''un échelon de type classe : un échelon de type groupe existe déjà pour l''attribut EchelonId égal à ', NEW.EchelonId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
ELSE
SET @N = (
SELECT COUNT(*)
FROM GROUPE_CLASSE
WHERE ClasseId = NEW.ClasseId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''un échelon à une classe : un groupe existe déjà pour l''attribut ClasseId égal à ', NEW.ClasseId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
END IF;
END IF;
END; |
ECHELON_GROUPE
1 2 3 4 5 6 7 8 9 10 11 12
| CREATE TRIGGER `fichier`.`ECHELON_GROUPE_BEFORE_INSERT` BEFORE INSERT ON `ECHELON_GROUPE` FOR EACH ROW
BEGIN
SET @N = (
SELECT COUNT(*)
FROM ECHELON_CLASSE
WHERE EchelonId = NEW.EchelonId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''un échelon de type groupe : un échelon de type classe existe déjà pour l''attribut EchelonId égal à ', NEW.EchelonId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
END IF;
END; |
GROUPE_CLASSE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE TRIGGER `fichier`.`GROUPE_CLASSE_BEFORE_INSERT` BEFORE INSERT ON `GROUPE_CLASSE` FOR EACH ROW
BEGIN
SET @N = (
SELECT COUNT(*)
FROM GROUPE_FONCTION
WHERE GroupeId = NEW.GroupeId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''un groupe de type classe : un groupe de type fonction existe déjà pour l''attribut GroupeId égal à ', NEW.GroupeId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
ELSE
SET @N = (
SELECT COUNT(*)
FROM ECHELON_CLASSE
WHERE ClasseId = NEW.ClasseId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''un groupe à une classe : un échelon existe déjà pour l''attribut ClasseId égal à ', NEW.ClasseId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
END IF;
END IF;
END; |
GROUPE_FONCTION
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE TRIGGER `fichier`.`GROUPE_FONCTION_BEFORE_INSERT` BEFORE INSERT ON `GROUPE_FONCTION` FOR EACH ROW
BEGIN
SET @N = (
SELECT COUNT(*)
FROM GROUPE_CLASSE
WHERE GroupeId = NEW.GroupeId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''un groupe de type fonction : un groupe de type classe existe déjà pour l''attribut GroupeId égal à ', NEW.GroupeId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
ELSE
SET @N = (
SELECT COUNT(*)
FROM CLASSE_FONCTION
WHERE FonctionId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''un groupe à une fonction : une classe existe déjà pour l''attribut FonctionId égal à ', NEW.FonctionId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
END IF;
END IF;
END; |
CLASSE_FONCTION
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE TRIGGER `fichier`.`CLASSE_FONCTION_BEFORE_INSERT` BEFORE INSERT ON `CLASSE_FONCTION` FOR EACH ROW
BEGIN
SET @N = (
SELECT COUNT(*)
FROM CLASSE_CORPS
WHERE ClasseId = NEW.ClasseId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''une classe de type fonction : une classe de type corps existe déjà pour l''attribut ClasseId égal à ', NEW.ClasseId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
ELSE
SET @N = (
SELECT COUNT(*)
FROM GROUPE_FONCTION
WHERE FonctionId = NEW.FonctionId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''une classe : un groupe existe déjà pour l''attribut FonctionId égal à : ', NEW.FonctionId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
END IF;
END IF;
END; |
CLASSE_CORPS
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
| CREATE TRIGGER `fichier`.`CLASSE_CORPS_BEFORE_INSERT` BEFORE INSERT ON `CLASSE_CORPS` FOR EACH ROW
BEGIN
SET @N = (
SELECT COUNT(*)
FROM CLASSE_FONCTION
WHERE ClasseId = NEW.ClasseId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''une classe de type corps : une classe de type fonction existe déjà pour l''attribut ClasseId égal à ',NEW.ClasseId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T ;
ELSE
SET @N = (
SELECT COUNT(*)
FROM FONCTION_CORPS
WHERE CorpsId = NEW.CorpsId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''une classe à un corps : une fonction existe déjà pour l''attribut CorpsId égal à ', NEW.CorpsId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
ELSE
SET @N = (
SELECT COUNT(*)
FROM COLLEGE
WHERE CorpsId = NEW.CorpsId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''une classe à un corps : un collège existe déjà pour l''attribut CorpsId égal à ', NEW.CorpsId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
END IF;
END IF;
END IF;
END; |
FONCTION_CORPS
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
| CREATE TRIGGER `fichier`.`FONCTION_CORPS_BEFORE_INSERT` BEFORE INSERT ON `FONCTION_CORPS` FOR EACH ROW
BEGIN
SET @N = (
SELECT COUNT(*)
FROM FONCTION_COLLEGE
WHERE FonctionId = NEW.FonctionId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''une fonction de type corps : une fonction de type collège existe déjà pour l''attribut FonctionId égal à ', NEW.FonctionId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
ELSE
SET @N = (
SELECT COUNT(*)
FROM CLASSE_CORPS
WHERE CorpsId = NEW.CorpsId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''une fonction à un corps : une classe existe déjà pour l''attribut CorpsId égal à ', NEW.CorpsId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
ELSE
SET @N = (
SELECT COUNT(*)
FROM COLLEGE
WHERE CorpsId = NEW.CorpsId
);
IF @N > 0 THEN
SET @N = CONCAT('Echec d''ajout d''une fonction à un corps : un collège existe déjà pour l''attribut CorpsId égal à ', NEW.CorpsId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
END IF;
END IF;
END IF;
END; |
FONCTION_COLLEGE
COLLEGE
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| CREATE TRIGGER `fichier`.`COLLEGE_BEFORE_INSERT` BEFORE INSERT ON `COLLEGE` FOR EACH ROW
BEGIN
SET @N = (
SELECT COUNT(*)
FROM FONCTION_CORPS
WHERE CorpsId = NEW.CorpsId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''un collège à un corps : une fonction existe déjà pour l''attribut CorpsId égal à ', NEW.CorpsId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
ELSE
SET @N = (
SELECT COUNT(*)
FROM CLASSE_CORPS
WHERE CorpsId = NEW.CorpsId
);
IF @N > 0 THEN
SET @T = CONCAT('Echec d''ajout d''un collège à un corps : une classe existe déjà pour l''attribut CorpsId égal à ', NEW.CorpsId);
SIGNAL SQLSTATE '45001' SET MESSAGE_TEXT = @T;
END IF;
END IF;
END; |
Envoyé par
fsmrel
J’espère que le tutoriel ne vous a pas donné la migraine ^^
Le tutoriel est très bien rédigé. Je me suis bien retrouvé la plupart du temps.
Je suis sénégalais. Mon français fait souvent défaut. C'est ce qui fait que mes explications ne sont pas toujours claires.
Merci !
Partager