Vous êtes sur la page 1sur 9

Cours de bases de donnes

http ://www.lamsade.dauphine.fr/rigaux/bd

SGBD relationnels Travaux pratiques

Philippe Rigaux

Table des matires


1 Interrogation avec SQL 1.1 Slections simples . . 1.2 Jointures . . . . . . . 1.3 Requtes imbriques 1.4 Ngation . . . . . . . 1.5 Fonctions de groupe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 3 4 4 5 5 5 5 6 6 7 7 7 7 8

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 !

1 Interrogation avec SQL


Au dpart, vous avez accs au schma et la base de donnes Films , vue et revue en cours, qui est partage (en lecture) par tout le monde. Voici le script de cration de ce schma (disponible sur le site). Ces commandes doivent maintenant vous tre familires (sinon relisez les chapitres correspondant). Exemple 1 SchemaFilms.sql : Le script de cration du schma
/* Commandes de cration de la base Films, test avec MySQL et PostgreSQL. Pour Oracle, il suffit de remplacer le type TEXT par le type LONG dans la table Film. Philippe Rigaux, 2004 */ /* Destruction eventuelle des tables existantes */ DROP DROP DROP DROP DROP DROP DROP TABLE Notation; TABLE Role; TABLE Film; TABLE Artiste; TABLE Internaute; TABLE Pays; TABLE Genre; */

/* Creation des tables

CREATE TABLE Internaute (email VARCHAR (40) NOT NULL, nom VARCHAR (30) NOT NULL , Philippe Rigaux (rigaux@lri.fr), Cours de bases de donnes, 2004

1.1 Slections simples

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));

CREATE TABLE Film

(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.1 Slections simples


1. Tous les titres de lms.

Philippe Rigaux (rigaux@lri.fr), Cours de bases de donnes, 2004

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.3 Requtes imbriques


Les requtes suivantes peuvent sexprimer avec une imbrication des clauses SELECT, mais on peut galement utiliser des jointures plat . Si le cur vous en dit, essayez les deux versions. 1. Donnez les nom et prnom des artistes qui on mis en scne un lm. 2. Donnez le titre et anne des lms qui ont le mme genre que Matrix. 3. Donnez le nom des internautes qui ont not le lm Alien. Donnez galement la note.

Philippe Rigaux (rigaux@lri.fr), Cours de bases de donnes, 2004

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.

1.5 Fonctions de groupe


1. Quelle est le nombre de lms nots par linternaute rigaux@cnam.fr, quelle est la moyenne des notes donnes, la note minimale et la note maximale ? 2. Combien de fois Bruce Willis a-t-il jou le role de McClane ? 3. Anne du lm le plus ancien et du lm le plus rcent. 4. id, Nom et prnom des ralisateurs, et nombre de lms quils ont tourns.

2 Cration dun schma relationnel


Il sagit de dnir un schma de base de donnes, dy intgrer des contraintes, des vues et dy insrer quelques informations. Vriez le comportement des contraintes et des vues en essayant de les mettre en dfaut.

2.1 Cration des tables


Crez les tables du schma Agence de voyages, vues en cours, et rappeles ci-dessous. Station (nomStation, capacit, lieu, rgion, tarif) Activite (nomStation, libell, prix) Client (id, nom, prnom, ville, rgion, solde) Sejour (id, station, dbut1 , nbPlaces) Attention bien dnir les cls primaires et trangres. Voici les autres contraintes portant sur ces tables. 1. Les donnes capacit, lieu, nom, ville, solde et nbPlaces doivent toujours tre connues. 2. Les montants (prix, tarif et solde) ont une valeur par dfaut 0. 3. Il ne peut pas y avoir deux stations dans le mme lieu et la mme rgion. 4. Les rgions autorises sont : Ocean Indien, Antilles, Europe, Ameriques et Extreme Orient. 5. La destruction dune station doit entraner la destruction de ses activits et de ses sjours. 6. Le prix dune activit doit tre infrieur au tarif de la station et suprieur 0. 7.
()

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

Philippe Rigaux (rigaux@lri.fr), Cours de bases de donnes, 2004

2.2 Insertion de donnes

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

Prix 150 120

id 10 20 30

nom Fogg Pascal Kerouac

prnom Phileas Blaise Jack

rgion Europe Europe Amrique

solde 12465 6763 9812

idClient 20

station Venusa

nbPlaces 4

F IG . 1 La base Agence

2.2 Insertion de donnes


Insrez dans la base les donnes de la gure 1 avec des ordres INSERT. Attention, lordre des INSERT est important (pourquoi ?). Vous pouvez ensuite tester les contraintes avec quelques ordres SQL. Par exemple : dtruisez la station et vriez que les activits ont disparu ; insrez une autre station en (Guadeloupe, Antilles) ; insrez une station dans une rgion Nullepart, etc.

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.1 Procdures stockes


Le langage utilis est le PL/SQL version PostgreSQL. Quelques modications mineures sufsent transcrire pour le PL/SQL dOracle. 1. Crer une fonction NomClient qui prend en entre lid dun client et qui renvoie une chane contenant le prnom et le nom du client (voir lexemple ralisateur.plsql). 2. Crer une fonction Activits qui prend en entre le nom du station et produit une chane de caractres contenant lnumration des activits de la station (par exemple, Ski, Yoga, Massage). 3. Crer ensuite une vue qui afche les stations, avec un attribut supplmentaire donnant la liste des activits (par appel la fonction bien sr). 4. Crer une fonction Actualiser qui prend en entre un pourcentage et le nom dune station, et augmente le tarif de la station et le prix de chacune de ses activits du pourcentage indiqu.

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.

3.3 Applications externes : PHP


Il ny a aucune limite (enn, presque), ce que lon peut faire avec une programmation HTML/PHP/PostgreSQL (ou nimporte quelle autre SGBD). Pour commencer vous devez installer les trois scripts vus en cours qui montrent les principales techniques (connexion, excution dune requte, interrogation par formulaire). Rcuprez les chiers sur le site (ils sont dans une archive pgphp.tar disponible dans la page des exemples). Vous devez ensuite effectuer les oprations suivantes : 1. Crer les tables FilmComplet et FilmSimple avec les deux scripts FilmSimple.sql et FilmCOmplet.sql 2. Insrer quelques lignes dans la table FilmSimple avec le script InsFilmSimple.sql 3. Modier les paramtres de connexion dans Connect.php

Philippe Rigaux (rigaux@lri.fr), Cours de bases de donnes, 2004

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.

Philippe Rigaux (rigaux@lri.fr), Cours de bases de donnes, 2004

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
()

Philippe Rigaux (rigaux@lri.fr), Cours de bases de donnes, 2004

Vous aimerez peut-être aussi