Fip1 TP BDD
Fip1 TP BDD
Fip1 TP BDD
Bases de Données
FIP1 Informatique
CNAM Paris
Nicolas.Travers (at) cnam.fr
.0=0
Table des matières
1 Procédures Stockées - Travaux Pratiques 3
1.1 Procédures simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.2 Fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.3 Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Curseurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.5 Procédure complexe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
4 Concurrence - Exercices 9
4.1 Graphe de sérialisabilité et équivalence des exécutions . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.2 Verrouillage à 2 phases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
4.3 Estampillage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Dans le cadre de ces travaux pratiques, nous utiliserons SQLDeveloper pour nous connecter à la base de données
Oracle (Serveur 11gR2). Pour cela, veuillez vous référer au guide d’utilisation de SQLDeveloper disponible avec ce
support d’exercices (seule la section 2.3 nous intéresse actuellement).
L’espace de travail est le même pour chacun d’entre vous. Pour faciliter la création des procédures et des fonc-
tions, chacune doit être suffixée par votre login. Exemple : affEtudiants_traversn.
La base de données utilisée gère l’emploi du temps d’une école d’enseignement supérieur. Elle intègre les étu-
diants, les matières, les enseignants et les différents cursus. La base est stockée dans le TABLESPACE ’NFP107’,
dont le schéma est représenté ci-dessous :
(1.1.2) Créer une procédure ’affNotes_xxxx’ qui affiche les notes avec l’intitulé du cours correspondant pour un
étudiant (nom et prénom) et année donnés ;
(1.1.3) Créer une procédure ’affMatieres_xxxx’ qui affiche les intitulés et coefficients des matières qu’un étudiant
(nom et prénom) suit durant une année donnée. Trier les matières par coefficients décroissants ;
1.3 Exceptions
(1.3.1) Modifier la fonction ’retEtudiant’ pour qu’elle puisse lever une exception si aucun étudiant n’est trouvé ;
(1.3.2) Modifier la procédure ’affMatieres’ en utilisant la fonction ’retEtudiant’ et afficher un message d’erreur lors-
qu’une exception est levé ;
1.4 Curseurs
(1.4.1) Créer une procédure ’affBulletins’ qui pour un étudiant donné, affiche l’intitulé de chaque parcours (avec l’an-
née d’inscription croissante) qu’il a suivi et pour chaque parcours les résultats obtenus pour chaque matière
(avec intitulé) ;
(1.4.2) Créer une procédure ’affInterventions’ qui affiche pour chaque niveau de parcours croissant les intitulés de
cours et de parcours dans lequel intervient un enseignant donné (nom et prénom) ;
(1.4.3) Créer une procédure ’majBulletins’ qui met à jour toutes les moyennes des inscriptions (utiliser la fonction
’moyennePondere’) des étudiants d’un parcours donné (id) ;
La création d’un Trigger est décrit dans le guide disponible sous claroline.
On souhaite ajouter à la base de données les contraintes qui ne sont pas exprimable sous formes de clés pri-
maires, clés étrangères, types, domaines de valeurs ou CHECK. Créer les Trigger correspondant aux contraintes
suivantes :
−− cours CM en salle de TP
insert into Seance values (200,1,TO_DATE('2015−10−15 09:00:00', 'YYYY−MM−DD HH24:MI:SS'),90,5,1,'Cours');
2.3 L’étage d’une salle ne peut être supérieur au nombre d’étages du bati-
ment
Requête de test :
INSERT INTO Salle VALUES (100, 1, 10, 1, 50, 'TP');
2.4 Deux séances de cours ne peuvent avoir lieu dans la même salle en même
temps
Jeu de test :
delete from seance where TRUNC(dateHeureDeb) = TO_DATE('2015−10−15', 'YYYY−MM−DD');
SELECT idSeance, idCours, TO_CHAR(dateHeureDeb, 'YYYY−MM−DD HH24:MI:SS') as Debut,
TO_CHAR(dateHeureDeb + Duree/24/60, 'YYYY−MM−DD HH24:MI:SS') as Fin
FROM seance WHERE TRUNC(dateHeureDeb) = TO_DATE('2015−10−15', 'YYYY−MM−DD');
2.5 Pour une année civile, la somme des durées des séances ne peut dépasser
le nombre d’heures maximum du cours associé
Jeu de test :
/* restauration de l'état initial*/
UPDATE Cours set nbHeuresMax = 30 WHERE idCours = 1;
DELETE FROM Seance WHERE TRUNC(dateHeureDeb) = TO_DATE('2015−10−15', 'YYYY−MM−DD');
Ce devoir est à effectuer par groupes de 2 et à retourner par email : nicolas . travers (at) cnam . fr
Un fichier composé de vos deux noms doit y figurer. Les numéros des questions doivent être associées aux
réponses.
Si vous souhaitez terminer ce travail à la maison, vous pouvez installer la base Oracle Express et SQLDevelo-
per.
1. On pourra créer une seconde procédure insert_personne2 avec les identifiants des parents
3.4 Trigger
(3.4.1) Créer un Trigger qui empêche l’insertion si un enfant est né avant ses parents (voire moins de 12 ans après) ;
(3.4.2) Créer un Trigger qui empêche l’insertion si le sexe d’un des parents ne respecte pas : père = homme et mère
= femme ;
Concurrence - Exercices
4.3 Estampillage
Etant donnée la séquence d’opérations suivante, donner l’exécution établie par un scheduler avec estampillage
simple. Le scheduler avec estampillage n’utilise que le test des estampilles, sans retarder ensuite l’exécution des
opérations. Considérez qu’une transaction rejetée est relancée tout de suite avec une nouvelle estampille et que ses
opérations déjà exécutées sont traitées avec priorité.
Pour que la base de données reste cohérente, il faut pour cela que pour une spectacle donné :
sum(places_reservees) = (places_of f ertes − places_libres).
Données L’état d’origine de notre base de données est donné par les requêtes suivantes :
DELETE FROM Reservation;
DELETE FROM Client;
DELETE FROM Spectacle;
Entre chaque test de concurrence sur notre schéma, la base de données doit avoir cet état pour être cohérent.
Ainsi, vous pourrez mettre à zéro la base en exécutant ce script.
5.3 Transactions
Pour chaque transactions ci-dessous, une séquence de requêtes n’est pas interchangeable. Les séquences ne
sont pas intégrées dans des procédures, pour permettre de décomposer les opérations dans le temps et favoriser la
concurrence. Vous devrez donc vérifier vous-même les conditions (T1 et T2 ) avec les valeurs LOCALES ’@’ à la session,
et le cas échéant, faire un ROLLBACK et arrêter la transaction.
(5.3.1) Donner pour chaque transaction les séquences d’opérations possibles. Noter, le cas échéant, les conditions
d’application de cette transaction (exemple : @nb_places < 2) ;
(5.3.2) Présenter par la suite, chaque histoire sous forme de suite d’opérations grâce aux transactions que vous venez
de produire 1 .
2. Ne pas oublier pas de supprimer le mode auto-commit et ni de vérifier le niveau d’isolation dans CHAQUE session
3. Sous MySQL, la lecture sale est résolue grâce au versioning, qui permet de garder l’image de la donnée avant la transaction
4. Comme MySQL est en versionning, le deadlock ne peut arriver que sur une histoire de la sorte w1 (x)w2 (y)w1 (y)w2 (x)