tp oracle - Cedric
Transcription
tp oracle - Cedric
TP ORACLE Francois Barthélémy∗et Cédric du Mouza∗ 1 Bien débuter 1.1 Se connecter à la base 1. Se connecter sur newton (ssh newton ou telnet newton) 2. Trouver le document pour réaliser le TP en se connectant à l’url http://cedric.cnam.fr/vertigo/Cours/ICPJ/planning-icpj/planning-icpj. html 3. Charger l’environnement pour le TP Oracle en exécutant la commande source /local/bin/env/ora8i.env 4. Se connecter à la base en lançant la commande sqlplus avec pour login votre login habituel et pour password celui apparaissant sur votre carte d’auditeur CNAM. 1.2 Où trouver de l’information sur Oracle Deux url qui pourront vous servir: • http://wwwlsi.supelec.fr/www/yb/poly_bd/sql/tdm_sql.html • http://dept25.cnam.fr:8080/BDA/Documentation.php 2 Consultation du schéma 1. Lister les tables dont on est propriétaire (“Select table_name from user_tables;”). 2. Lister les tables de l’utilisateur DUMOUZA (“Select table_name from all_tables where owner = ’DUMOUZA’;”). 3. Description de la table album (attributs et formats) (“desc album”). 1 Lab. CEDRIC, équipe VERTIGO, CNAM, Paris, France, {barthe,dumouza}@cnam.fr 1 3 Administration 3.1 Création des tables On souhaite créer une base de données afin de gérer ses jeux vidéo. A cet effet vous devez tout d’abord créer une table Editeur avec les attributs suivants: 1. codeEd: code de l’éditeur (entier de longueur maximale 10) 2. nomEd: nom de l’éditeur (chaîne de caractères de longueur maximale 40) 3. pays: pays du siège social de la compagnie (chaîne de caractères de longueur maximale 40) 4. fondation: année de fondation de la compagnie (entier de longueur 4) codeEd est la clé primaire de la relation alors qu’on veut également la création d’un index sur le nom des pays. On souhaite également conserver des informations sur les jeux. Vous devez alors créer une table games avec les attributs suivants: 1. codeG: un code identifiant de manière unique le jeu (entier de longueur maximale 10) 2. nomG: le nom du jeu (chaîne de caractères de longueur maximale 40) 3. genre: la famille de jeux auquel il se rattache (chaîne de caractères de longueur maximale 40) 4. annee: l’année de sortie du jeu (entier de longueur 4) 5. codeEd: code de l’éditeur du jeu (entier de longueur maximale 10) 6. prix: le prix payé pour le jeu (nombre avec jusqu’à deux décimales) On précise que codeG est une clé primaire de la relation et que codeEd est une clé étrangère (il est donc conseiller de créer d’abord la table Editeur avant celle-ci, sinon il faut modifier la table avec la commande ALTER). Créez également un index sur codeEd et un index sur prix. Valider ensuite la création de vos table à l’aide de la commande commit. 3.2 Utilisation des tables 1. Ajouter le n-uplet correspondant à l’éditeur américain ’Blizzard’, fondé en 1994. 2. Ajouter le n-uplet correspondant au jeu ’Warcraft 3’, jeu de type ’Temps-reel’, sorti en 2004, édité par ’Blizzard’, et mis en vente au prix de 50 euros. 3. Supprimer le n-uplet correspondant au jeu ’Warcraft 3’ et au label ’Blizzard’. 4. Exécuter ensuite le script sql de chargement des données que vous chargez à l’url suivant: 2 http://cedric.cnam.fr/~dumouza/data_seg2_1.sql (lancer une fois téléchargé, “@data_seg2_1.sql” dans sqlplus). Valider les insertions à l’aide de la commande commit. Vous voici prêts à commencer... 5. Mettre à jour le prix de ’The Sims’ à 10 euros. 6. Mettre à jour tous les prix de l’éditeur ’Ubisoft’ à 20 euros. 7. annuler toutes vos mises à jour. 4 Concurrence Vous allez travailler sur la base de jeux vidéo de la section précédente. Pour cela vous allez créer dans un premier temps, à l’aide de votre éditeur préféré, les 5 fichiers suivants: 1. sel.sql PROMPT ’*************** Liste des Jeux ***************’; SELECT * FROM Games WHERE nomG=’Fifa 2005’ OR nomG=’Warcraft 3’ OR nomG=’The Sims’; 2. majFifa.sql PROMPT ’*********** Augmentation du prix du jeu Fifa2005 de 10 euros ***********’; UPDATE Games SET prix = prix + 10 WHERE nomG = ’Fifa 2005’; 3. majWar3.sql PROMPT ’*********** Augmentation du prix du jeu Warcraft 3 de 10 euros ***********’; UPDATE Games SET prix = prix + 10 WHERE nomG = ’Warcraft 3’; 4. majSims.sql PROMPT ’*********** Augmentation du prix du jeu The Sims de 10 euros ***********’; UPDATE Games SET prix = prix + 10 WHERE nomG = ’The Sims’; 5. annule.sql PROMPT ’*********** Retour a la base initiale ***********’; UPDATE Games SET prix = 54 where codeG=1; UPDATE Games SET prix = 50 where codeG=2; UPDATE Games SET prix = 15 where codeG=4; COMMIT; Le TP porte sur la concurrence d’accès à une base de données. Pour simuler l’exécutions de programmes concurrents, ouvrez 2 fenêtres terminal, placez vous dans le répertoire contenant less fichiers sql précédemment créés et connectez vous sur chacune de ces consoles à la base oracle avec sqlplus. ORACLE considère chaque session comme un utilisateur. ainsi même si une personne est connectée deux fois à la base, ORACLE considère qu’il s’agit de 2 personnes différentes. Nous avons donc deux utilisateurs notés 1 et 2 3 réalisant des opérations de lecture, écriture, validation, annulation, en concurrence sur la base. On considère pour ce TP 3 ressources correspondant à 3 lignes de la base: les jeux de code 1, 2 et 4. On nommera ces ressources dans les histoires fifa, war3 et sims. Dans les histoires suivantes les différentes opérations sont indexées par le numéro de l’utilisateur et on désigne par: • r une opération de lecture réalisée sur les 3 ressources simultanemment des 3 ressources (executez sel.sql) • w une opération d’écriture sur 1 des ressources (exécutez majFifa.sql pour la ressource fifa par exemple) • c pour la validation d’une transaction (exécutez la commande commit;) • a pour l’annulation d’une transaction (exécutez la commande rollback;) Pour chacune des histoires suivantes analysez le résultat obtenu et essayez de comprendre ce qu’il s’est passé. Ensuite annulez toutes les modifications, après chaque histoire, en laçant la commande sql suivante: annule.sql. 4.1 Niveau “Read-Committed” (défault) Il s’agit du mode par défaut d’ORACLE. Après avoir exécuté et expliqué chacune des histoire, essayez d’expliquer quelle est la stratégie par défaut d’ORACLE. Ce type de verrouillage garantit-t’il la sérialisabilité? Pourquoi? 1. r1 .r2 .w1 [f if a].r2 .w1 [war3].r2 .a1 .r2 2. r1 .r2 .w1 [f if a].r2 .c1 .r2 .w1 [f if a].r2 .c1 .r2 3. r1 .r2 .w1 [f if a].w2 [war3].r1 .r2 .c1 .c2 .r1 .r2 4. r1 .r2 .w1 [f if a].w2 [war3].r1 .r2 .w1 [sims].w2 [sims].r1 .r2 .c1 .c2 .r1 .r2 5. r1 .r2 .w1 [f if a].w2 [war3].r1 .r2 .w2 [f if a].w1 [war3].r1 .r2 .a1 .a2 .r1 .r2 4.2 Avec verrous en lecture Comme vous avez pu le constater à la section précédente, le verrouillage par défaut d’ORACLE est différent du verrouillage à deux phases présenté en TD. Transformez le code pour la selection en ajoutant la clause FOR UPDATE et reprennez toutes les histoires précédentes. Expliquez ce que vous observez pour chacune et pour conclure expliquez quelle est la nouvelle stratégie appliquée. N’oubliez pas après chaque histoire de supprimer vos modification en exécutant annule.sql. 4