Précédent   Forum des professionnels en informatique > Bases de données > MySQL > SQL Procédural
SQL Procédural Forum d'entraide sur les triggers, les procédures stockées et les fonctions en MySQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 18/12/2010, 14h02   #1
Invité de passage
 
Inscription : août 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 19
Points : 2
Points : 2
Par défaut Contrainte inclusion étendue

Bonjour,
Pour traduire la contrainte inclusion qui est sur le schéma ci-dessous je sais que je dois utiliser un trigger


Pour chaque insertion dans la table subir, il faut que je vérifie que l'étudiant est inscrit dans l'uv concerné par le contrôle
Mais je ne voie pas comment faire.
Merci de votre aide
Yann
Yann_br est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 14h05   #2
Membre Expert
 
Avatar de gene69
 
Inscription : janvier 2006
Messages : 951
Détails du profil
Informations personnelles :
Localisation : France

Informations professionnelles :
Secteur : High Tech - Produits et services télécom et Internet

Informations forums :
Inscription : janvier 2006
Messages : 951
Points : 1 063
Points : 1 063
va tout les objets triviaux.
une table étudiant ( id, nometudiant )
une table uv ( id, nomuv )
une table controle ( id, nomcontrole )

va pour les associations

une table pour l'association inscrit( id, idetudiant, iduv)
une table ..... portersur( id, idcontrole, idiv)
une table ..... subir( id, idinscrit, idportersur )

enfin de fait ça en 10 secondes sans réfléchir, doit certainement un moyen de ne faire que deux tables.
__________________
PHP fait nativement la validation d'adresse électronique Vous êtes perdu en PHP? rassurez-vous ici (en)
Utilisez le bouton résolu!
gene69 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 17h55   #3
Modérateur
 
Avatar de CinePhil
 
Homme Philippe Leménager
Ingénieur d'études en informatique
Inscription : août 2006
Messages : 10 979
Détails du profil
Informations personnelles :
Nom : Homme Philippe Leménager
Âge : 48
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur d'études en informatique
Secteur : Enseignement

Informations forums :
Inscription : août 2006
Messages : 10 979
Points : 18 224
Points : 18 224
Envoyer un message via MSN à CinePhil
OK pour ça (et encore partiellement, voir plus bas) :
Citation:
va tout les objets triviaux.
une table étudiant ( id, nometudiant )
une table uv ( id, nomuv )
une table controle ( id, nomcontrole )
Pas sur ça :
Citation:
va pour les associations
une table pour l'association inscrit( id, idetudiant, iduv)
une table ..... portersur( id, idcontrole, idiv)
une table ..... subir( id, idinscrit, idportersur )
Une table associative a pour clé primaire les identifiants des tables entrant en jeu dans l'association.

Avec une association (1,1 - 0,n) l'identifiant de la table du côté 0,n donne une clé étrangère dans la table côté 1,1.

Donc avec le MCD donné, on a plutôt les tables suivantes :
Uv (uv_id, uv_nom...)
Etudiant (etu_id, etu_nom, etu_prenom...)
Controle (ctr_id, ctr_id_uv...)
Subir (sbr_id_etudiant, sbr_id_controle, sbr_date, sbr_note...)
Inscrire (ins_id_etudiant, ins_id_uv, ins_annee...)

Et il faut effectivement vérifier par un TRIGGER ON INSERT sur la table Subir que le couple {sbr_id_etudiant, ctr_id_uv (obtenu en utilisant sbr_id_controle} existe bien parmi les couples {ins_id_etudiant, ins_id_uv} de la table Inscrire.

N'en ayant encore fait que très peu, le mien sera peut-être faux mais dans le principe ça devrait être quelque chose comme ça :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE TRIGGER tg_insert_subir BEFORE INSERT ON Subir FOR EACH ROW
DELIMITER //
BEGIN
    IF
    (
        SELECT COUNT(*)
        FROM Inscrire AS i
        INNER JOIN Uv ON Uv.uv_id = i.ins_id_uv
            INNER JOIN Controle AS c ON c.ctr_id_uv = uv.uv_id
        WHERE c.ctr_id = NEW.sbr_id_controle
            AND i.ins_id_etudiant = NEW.sbr_id_etudiant
    )
    = 0
    THEN
        CALL pa_generer_erreur('L''étudiant n''est pas inscrit à l''uv de ce contrôle !');
    END IF
END//
Et la procédure pa_generer_erreur ci-dessous permet de générer une erreur que le programme utilisant la BDD peut récupérer et traiter.
Code :
1
2
3
4
5
6
7
DELIMITER //
 
CREATE PROCEDURE pa_generer_erreur(_Message VARCHAR(128))
BEGIN
  INSERT INTO ta_erreur_err (err_message) VALUES (_Message);
  INSERT INTO ta_erreur_err (err_message) VALUES (_Message);
END//
Elle insère deux fois la même ligne alors qu'il y a une contrainte d'unicité sur le texte du message.

Quand à la table ta_erreur_err, la voici :
Code :
1
2
3
4
5
6
7
CREATE TABLE `ta_erreur_err` (
  `err_id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `err_message` varchar(128) NOT NULL COMMENT 'Libellé du message d''erreur',
  `err_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT 'Date de génération du message d''erreur.',
  PRIMARY KEY (`err_id`),
  UNIQUE KEY `x_u_err_message` (`err_message`)
) ENGINE=MEMORY DEFAULT CHARSET=latin1
__________________
Philippe Leménager. Ingénieur d'étude à l'École Nationale de Formation Agronomique.
Mon blog sur la conception des BDD, le langage SQL, le PHP avec Zend Framework...
« Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
À la maison comme au bureau, j'utilise Mandriva Linux ou Mageïa ! Soutenons l'industrie logicielle française !
Linuxiens, comptez-vous !
CinePhil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/12/2010, 20h19   #4
Invité de passage
 
Inscription : août 2007
Messages : 19
Détails du profil
Informations forums :
Inscription : août 2007
Messages : 19
Points : 2
Points : 2
Merci pour vos réponses
Yann
Yann_br est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 08h43.


 
 
 
 
Partenaires

Hébergement Web