Académique Documents
Professionnel Documents
Culture Documents
Chap TP
Chap TP
http ://www.lamsade.dauphine.fr/rigaux/bd
Philippe Rigaux
2 Cration dun schma relationnel 2.1 Cration des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.2 Insertion de donnes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2.3 Vues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Programmation 3.1 Procdures stockes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.2 Triggers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3.3 Applications externes : PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Concurrence daccs
Tous les travaux pratiques dcrits dans ce qui suit peuvent seffectuer en ligne grce linterface web disponible lURL : http ://www.lamsade.dauphine.fr/rigaux/bd La mise en uvre est simplissime puisquil ny a rien installer : vous avez juste besoin dun ordinateur accdant au Web. Les instructions pour utiliser le systme sont disponibles en ligne. Sachez simplement quil est possible de pratiquer SQL sans autre formalit. En revanche, pour crer une base et disposer dun environnement de travail permettant des crations, des modications et lcriture dune application, il faudra fournir quelques informations permettant de crer un compte. Vous accderez ensuite au systme avec un login et un mot de passe. Il est galement possible deffectuer ces TP dans dautres conditions : le seul pr-requis est en fait de disposer dun SGBD relationnel sufsamment avanc, et dun terminal daccs permettant dentrer les commandes en ligne. Voyez dans un tel cas avec votre enseignant quelles sont les oprations dinstallation effectuer. Les exercices proposs comprennent peu prs toutes les oprations dont la matrise est ncessaire la pratique correcte et efcace un SGBD relationnel, savoir : interrogation avec le langage SQL (section 1, page 1) ; insertions et mise jour diverses et varis ; conception et cration dun schma avec tables, vues, contraintes, index, etc. ; mcanisme de concurrence daccs ; accs la base avec un langage de programmation interne (PL/SQL) ou externe (Java, PHP). Un projet rcapitulant lensemble de ces connaissances vous est galement propos. Il est clair que la prsence dun enseignant pour vous guider est prfrable. Si ce nest pas le cas, vous ne risquez rien tenter votre chance pour exprimenter et voir si vous vous en sortez ou non. Dans tous les cas, bonne chance !
CREATE TABLE Internaute (email VARCHAR (40) NOT NULL, nom VARCHAR (30) NOT NULL , Philippe Rigaux (rigaux@lri.fr), Cours de bases de donnes, 2004
prenom VARCHAR (30) NOT NULL, region VARCHAR (30), CONSTRAINT PKInternaute PRIMARY KEY (email)); CREATE TABLE Pays (code VARCHAR(4) NOT NULL, nom VARCHAR (30) DEFAULT Inconnu NOT NULL, langue VARCHAR (30) NOT NULL, CONSTRAINT PKPays PRIMARY KEY (code)); CREATE TABLE Artiste (idArtiste INTEGER NOT NULL, nom VARCHAR (30) NOT NULL, prenom VARCHAR (30) NOT NULL, anneeNaiss INTEGER, CONSTRAINT PKArtiste PRIMARY KEY (idArtiste), CONSTRAINT UniqueNomArtiste UNIQUE (nom, prenom));
(idFilm INTEGER NOT NULL, titre VARCHAR (50) NOT NULL, annee INTEGER NOT NULL, idMES INTEGER, genre VARCHAR (20) NOT NULL, /* Remplacer TEXT par LONG pour ORACLE */ resume TEXT, codePays VARCHAR (4), CONSTRAINT PKFilm PRIMARY KEY (idFilm), FOREIGN KEY (idMES) REFERENCES Artiste, FOREIGN KEY (codePays) REFERENCES Pays);
CREATE TABLE Notation (idFilm INTEGER NOT NULL, email VARCHAR (40) NOT NULL, note INTEGER NOT NULL, CONSTRAINT PKNotation PRIMARY KEY (idFilm, email)); CREATE TABLE Role (idFilm INTEGER NOT NULL, idActeur INTEGER NOT NULL, nomRole VARCHAR(30), CONSTRAINT PKRole PRIMARY KEY (idActeur,idFilm), FOREIGN KEY (idFilm) REFERENCES Film, FOREIGN KEY (idActeur) REFERENCES Artiste); CREATE TABLE Genre (code VARCHAR (20) NOT NULL, CONSTRAINT PKGenre PRIMARY KEY (code));
Vous pouvez remarquer que lordre de cration des tables respecte le rfrencement entre PRIMARY KEY et FOREIGN KEY. Les tables qui sont rfrences par cette dernire clause doivent tre cres avant celles qui les rfrencent. Par exemple la table Artiste est cre avant la table Film cause de la cl trangre idMES. Cest en revanche lordre inverse qui est suivi pour les commandes DROP : on ne peut pas dtruire une table qui est rfrence par une commande FOREIGN KEY. Notez quen principe on ne place pas les commandes DROP dans un script de cration puisquon ne souhaite pas prendre le risque de dtruire des donnes existantes. Comme il sagit ici dune base de test, la situation est diffrente. La base est disponible sur le site et contient un chantillon de lms avec leur metteur en scne, leurs acteurs et les notations de quelques internautes. vous de jouer : il faut concevoir, saisir et excuter les ordres SQL correspondant aux requtes qui suivent.
1.2 Jointures
2. Nom et prnom des internautes auvergnats. 3. Titre et anne de tous les drames, tris par anne ascendante. Donnez ensuite le tri par anne descendante. 4. Nom et anne de naissance des artistes ns avant 1950. 5. Titre et anne de tous les lms parus entre 1960 et 1980 6. Tous les genres de lms (liminez les doublons). 7. Titre, genre et rsum des lms qui sont soit des drames, soit des westerns (utilisez la construction IN), et dont le rsum contient la chane de caractres vie . 8. Les artistes dont le nom commence par H (commande LIKE). 9. Quels sont les acteurs dont on ignore lanne de naissance ? (Attention : cela signie que la valeur est absente). 10. Prnom, nom et ge de chaque artiste (NB : lge est la diffrence entre lanne courante et lanne de naissance). Nommez ge la colonne obtenue (commande AS).
1.2 Jointures
1. Qui jou le rle de Morpheus (nom et prnom) ? 2. Qui est le ralisateur de Alien ? 3. Prnom et nom des internautes qui ont donn une note de 4 un lm (donner aussi le titre du lm). 4. Quels acteurs ont jou quel rle dans le lm Vertigo ? 5. Films dont le ralisateur est Tim Burton, et un des acteurs est Johnny Depp. 6. Titre des lms dans lesquels a jou Bruce Willis. Donner aussi le nom du rle. 7. Quel metteur en scne a tourn dans ses propres lms ? Donner le nom, le rle et le titre des lms. 8. Quel metteur en scne a tourn en tant quacteur (mais pas dans son propre lm) ? Donner le nom, le rle et le titre des lms o le metteur en scne a jou. 9. Dans quels lms le metteur en scne a-t-il le mme prnom que lun des interprtes ? (titre, nom du metteur en scne, nom de linterprte). Le metteur en scne et linterprte ne doivent pas tre la mme personne.
1.4 Ngation
1.4 Ngation
L encore, il existe souvent plusieurs manires dexprimer la mme requte. 1. Les lms sans rle. 2. Nom et prnom des acteurs qui nont jamais mis en scne de lm. 3. Les internautes qui nont pas not de lm paru en 1999.
Pour une date de dbut donne, le nombre total de places rserves dans une station doit tre infrieur la capacit de la station.
Conseil : donnez des noms vos contraintes PRIMARY KEY, FOREIGN KEY et CHECK avec la clause CONSTRAINT.
1 Utiliser
le type DATE
NomStation Venusa
Station Capacit Lieu 350 Guadeloupe Activite NomStation Libell Venusa Voile Venusa Plonge Client ville Londres Paris New York Sejour dbut 03-08-2003
Rgion Antilles
Tarif 1200
id 10 20 30
idClient 20
station Venusa
nbPlaces 4
F IG . 1 La base Agence
2.3 Vues
Maintenant il faut crer des vues et tester linterrogation et la mise jour travers ces vues. 1. Crez les vues suivantes sur le schma prcdent. (a) Une vue ActivitesModiques (Station, Activite) donnant le nom des stations et des activits dont le prix est infrieur 140 FF. Toute ligne insre dans cette vue doit apparatre dans la vue ensuite. (b) Une vue ActivitesCheres, de mme schma, avec prix suprieur 140 FF, et la mme contrainte dinsertion. (c) Une vue StationDollars (Nom, Capacite, Lieu, TarifDollar) donnant le nom dune station, sa capacit, le lieu et le tarif en dollars (metez le taux de conversion en dur , ou bien mieux crez une table stockant le taux de conversion). (d) Une vue Tarifs (Station, Tarif, OptionMin, OptionMax) donnant, pour chaque station, le tarif et les prix min et max des activits. (e) Une vue Reservation (nomStation, PlacesReservees) donnant, par station et date de dbut de sjour, le nombre de places rserves. 2. Consultez ensuite le contenu de ces vues. Vous pouvez insrez quelques lignes supplmentaires dans les tables et constater quelles sont prises en compte dans les vues. 3. Dans quelles vues peut-on insrer, dtruire et mettre jour ? Essayez les oprations suivantes : (a) Insrez une activit Kayac pour la station Venusa dans ActivitesCheres et ActivitesModiques. Le contrle sur linsertion est-il utile dans ce cas ?
Philippe Rigaux (rigaux@lri.fr), Cours de bases de donnes, 2004
(b) Peut-on insrer dans StationEuro ? Sous quelle condition ? Faites lessai. (c) Dtruisez une ligne de StationEuro.
3 Programmation
Les exercices qui suivent permettent de se familiariser avec les langages de programmation interne (PL/SQL) et externe (Java/JDBC, PHP) permettant de manipuler une base de donnes de manire procdurale. Des exemples sont fournis sur le site, qui doivent vous permettre de crer vos propres procdures, fonctions et programmes.
3.2 Triggers
1. Implantez par un trigger la rgle suivante : si le prix dune activit baisse, alors le tarif de la station doit augmenter de la diffrence. Indication : le trigger doit se dclencher sur une modication, et tester pour chaque ligne que la nouvelle valeur est plus grande que lancienne. Si ce nest pas le cas, faire un UPDATE de la station pour ajouter la diffrence entre lancienne et la nouvelle valeur. 2. Faites lexprience : diminuez le prix dune activit, et regardez ce qui se passe pour la station. 3. On veut disposer de linformation nbActivites dans la table Station. Pour cela : (a) Ajoutez la colonne nbActivites avec pour valeur par dfaut 0. (b) Crez un trigger qui maintient cette information. 4. Interdisez par un trigger linsertion dune ligne dans la table Sjour si le solde du client est infrieur au nombre de places multipli par le tarif de la station.
4. ExPGSQL1.php interroge et afche le contenu de FilmSimple. 5. ExForm3.html afche un formulaire pour rechercher des donnes en lanant le script ExPGSQL2.php 6. ExForm4.html afche un formulaire pour insrer, modier oui dtruire des donnes en lanant le script ExPGSQL3.php Vous trouverez beaucoup plus de scripts (pour MySQL, adapter PostgreSQL) sur le site du livre Pratique de MySQL et PHP, lURL http ://www.lamsade.dauphine.fr/rigaux/mysqlphp. Voici quelques suggestions pour des scripts PHP sur la base Station. 1. Rcuprez les scripts PHP donns en exemple, et travaillant sur la table FilmSimple, et adaptez-les pour saisir et modier les informations de la table Client. 2. Faites un formulaire de saisie dun sjour, en proposant la liste des stations et la liste des clients dans un menu droulant. Ces exercices sont ralisables sur le site de TP en ligne.
4 Concurrence daccs
On va maintenant tudier le comportement concret dun SGBD en cas daccs concurrents la mme ressource. Pour cel on va simuler lexcution concurrente de programmes laide du petit ensemble de lectures/critures sur la base Agence de voyage cr dans le premier exercice : modication du solde de certains clients et slection des clients. Crez 4 chiers, nomms SEL.sql, MAJpas.sql, MAJfog.sql et MAJker.sql et entrez-y les commandes suivantes : 1. SEL.sql PROMPT Affichage des clients =>; SELECT * FROM client; 2. MAJpas.sql PROMPT Augmentation du client Pascal =>; UPDATE client SET solde = solde + 1000 WHERE client = Pascal; 3. MAJfog.sql PROMPT Augmentation du client Fogg =>; UPDATE client SET solde = solde + 1000 WHERE client = Fogg; 4. MAJker.sql PROMPT Augmentation du client Kerouac =>; UPDATE client SET solde = solde + 1000 WHERE client = Kerouac; Ensuite, ouvrez deux fentres et lancez SQLPLUS dans chacune : chaque session est considre par ORACLE comme un utilisateur, et on a donc 2 utilisateurs, nomms 1 et 2, en situation de concurrence. Dans tout ce qui suit, on note IN ST Ri lexcution de linstruction IN ST R par lutilisateur i. Par exemple M AJker1 corespond lexcution du chier MAJker dans la premire fentre par la commande @MAJker. On note de mme ROLi et COMi lexcution des commandes rollback ; et commit ; dans la fentre i. Questions Executez les squences dinstruction dcrites ci-dessous. Dans chacun des cas, expliquez ce qui se passe.
1. Premire exprience : lutilisateur 1 effectue des mises--jour, tandis que lutilisateur 2 ne fait que des slections. Que constate-t-on ? SEL1 , SEL2 , M AJker1 , SEL2 , M AJpas, SEL2 , ROL1 , SEL2 . 2. idem, mais avec des commit. SEL1 , SEL2 , M AJker1 , SEL2 , COM1 , SEL2 , M AJker1 , SEl2 , COM1 , SEL2 . 3. Maintenant les deux utilisateurs effectuent des MAJ simultanes. SEL1 , SEL2 , M AJker1 , M AJpas2 , SEl1 , SEL2 , M AJf og1 , M AJf og2 , SEL1 , COM1 , COM2 . Un bloquage est apparu. Pourquoi ? 4. Idem, avec un ordre des oprations qui diffre dun utilisateur lautre. SEL1 , SEL2 , M AJker1 , M AJpas2 , SEl1 , SEL2 , M AJpas1 , M AJker2 ROL1 ROL2 . Que constate-t-on ? 5. En fait, ORACLE pratique une verrouilage deux phases assez libral, qui ne garantit pas la srialisabilit : aucun verrrou nest plac sur une ligne lors dune lecture. Lutilisateur peut verrouiller explicitement en ajoutant la clause FOR UPDATE. Exemple : SELECT * FROM client FOR UPDATE ; Chaque ligne slectionne est alors verrouille. Refaites les expriences prcdentes avec un verrouillage explicite des lignes que vous voulez modier. 6. Exprimentez les excutions prcdentes en spciant le mode suivant : SET TRANSACTION ISOLATION LEVEL SERIALIZABLE
()