Université Pierre et Marie Curie - Paris 6 - UFR 922 - Licence d'informatique
Module Bases de Données et Sites Web
Partiel du 1
eravril 2005
Documents autorisés – Durée : 2h.
Exercice 1 : Autorisation 2 pts
Question 1. On considère le schéma relationnel suivant :
Enseignant (id-ens, nom, prenom, grade, domaine) Etudiant (id-et, nom, prenom, niveau, statut ) Enseigne (id-ens, id-cours)
Cours (id-cours, titre, salle, jour)
Quels sont les privilèges nécessaires pour exécuter les requêtes suivantes ? Pour chacune des requêtes, on donnera les privilèges les plus spécifiques, et les privilèges généraux permettant d’effectuer la requête.
a) SELECT nom, prenom FROM Enseignant UNION
SELECT nom, prenom FROM Etudiant where niveau = ‘doctorat’ ; Privilèges les plus spécifiques :
Privilèges généraux :
Réponse :
Spécifiques : Grant SELECT (nom, prenom) on Enseignant Grant SELECT(nom, prenom, niveau) on Etudiant
Généraux : Grant SELECT on Enseignant et grant SELECT on Etudiant b) SELECT domaine FROM Enseignant E1, Enseigne E2
WHERE E1.id-ens=E2.id-ens AND E2.id-cours IN
(SELECT id-cours FROM Cours WHERE jour = ‘vendredi’);
Privilèges les plus spécifiques :
Privilèges généraux :
Réponse : Spécifiques :
Grant SELECT(domaine, id-ens) ON Enseignant,
Grant SELECT (id-cours ; id-ens, jour) ON Cours, SELECT (id-ens,id-cours) on Enseigne Généraux :
Grant SELECT on Enseignant, Cours, Enseigne c) INSERT INTO Enseignant(nom)
SELECT DISTINCT nom FROM Etudiant WHERE statut = ‘moniteur’ AND
nom NOT IN (SELECT nom FROM Enseignant) Privilèges les plus spécifiques :
Privilèges généraux :
Réponse :
Spécifiques : Grant INSERT (nom) on Enseignant
Grant SELECT(nom,statut) on Etudiant, SELECT(nom) on Enseignant Généraux : INSERT, SELECT on Enseignant, SELECT on Etudiant.
Question 2. On considère la séquence d’autorisation suivante (Max est propriétaire de R):
(1) Max GRANT INSERT ON R TO Luc, Léa WITH GRANT OPTION (2) Luc GRANT INSERT ON R TO Zoé
(3) Luc GRANT INSERT(A1) ON R TO Jules WITH GRANT OPTION (4) Léa GRANT INSERT(A1) ON R TO Zoé
(5) Jules GRANT INSERT (A1) ON R TO Léa WITH GRANT OPTION (6) Max REVOKE INSERT ON R FROM Luc
Donnez l’état du graphe à l’étape 5 puis à l’étape 6 Graphe à l’étape 5 :
Graphe à l’étape 6 :
Réponse : A l’étape 5 :
Max possède tous les droits sur R
Luc :possède INSERT on R, avec grant OPTION
Léa possède INSERT on R et INSERT(A1) on R avec grant option Zoé possède INSERT on R, et INSERT(A1) on R
Jules possède INSERT(A1) on R, avec grant option
A l’étape 6 :
Max possède tous les droits.
Zoé possède INSERT(A1) on R
Léa possède INSERT on R avec grant option Jules et Luce n’ont plus de droits sur R.
Exercice 2 : Transactions 4 pts
On considère la relation R(a, b). Dans l'état initial, la relation R contient 2 tuples :
[1, 10]
[2, 20]
On considère les transactions T1 et T2. Les instructions SQL de chaque transaction sont numérotées.
T1 : 1.1 : update R set b = 3 * (select b from R where a=2) where a=1;
1.2 : update R set b = (select b from R where a=1) - b where a=2;
1.3 : commit;
T2 2.1 : update R set b=b + 5 where a=2;
2.2 : commit;
Le SGBD utilise de l'estampillage et gère plusieurs versions des données pour garantir l'isolation des transactions.
Question 1 Pour éviter les écritures perdues, le SGBD doit-il demander un verrou exclusif avant toute écriture? Justifier
oui
non
Justif. :
Oui toujours un Vx avant une écriture pour éviter le cas suivant :
E1a, E2a, commit T1, commit T2 : perte de E1a
Question 2. On donne les séquences suivantes :
S1 1.1, 1.2, 1.3, 2.1, 2.2 S2 2.1, 2.2, 1.1, 1.2, 1.3 S3 1.1, 2.1, 2.2, 1.2, 1.3
On propose de traiter les séquences S1 à S3, avec le niveau d'isolation read committed ou sérializable.
Chaque séquence est traitée à partir de l'état initial de R. On considère qu'une transaction abandonne (puis ne recommence pas) lorsque le SGBD refuse de traiter une opération.
- Toutes les instructions peuvent-elles être traitées? Répondre dans le tableau ci-dessous en soulignant en bleu les instructions qui ont pu être traitées.
- Donner la valeur des 2 tuples de R en fin d'exécution, selon le niveau d'isolation choisi. On note RC le niveau read committed et SER le niveau serializable. Répondre en complétant les colonnes du tableau et en donnant une brève explication
Séquence souligner les instructions traitées
état final Explication
S1 niveau RC 1.1, 1.2, 1.3, 2.1, 2.2
[1, ...]
[2, ... ]
S1 niveau SER 1.1, 1.2, 1.3, 2.1, 2.2
[1, ...]
[2, ... ]
S2 niveau RC 2.1, 2.2, 1.1, 1.2, 1.3
[1, ...]
[2, ... ]
S2 niveau SER 2.1, 2.2, 1.1, 1.2, 1.3
[1, ...]
[2, ... ]
S3 niveau RC 1.1, 2.1, 2.2, 1.2, 1.3
[1, ...]
[2, ... ]
S3 niveau SER [1, ...]
1.1, 2.1, 2.2, 1.2, 1.3 [2, ... ]
S1 1.1, 1.2, 1.3, 2.1, 2.2
Séquence en série T1 puis T2 (donc sérializable): état final [1, 60] [2, 45]
Exécution identique en RC et en SER S2 2.1, 2.2, 1.1, 1.2, 1.3
Séquence en série T2 puis T1 (donc sérializable): état final [1, 75] [2, 50]
Exécution identique en RC et en SER S3 1.1, 2.1, 2.2, 1.2, 1.3
S3 Niveau RC (read committed)
Etat vu par T1 après 1.1 : [1, 60] [2, 20]
Etat vu par T2 après 2.1, 2.2 [1, 10] [2, 25]
Etat vu par T1 après 2.2 [1, 60] [2, 25]
Etat vu par T1 après 1.2, 1.3 [1, 60] [2, 35]
S3 Niveau SER (sérializable); 1.1, 2.1, 2.2, sont traitées puis 1.2 est refusée
Car 1.2 modifie le 2ème tuple, qui a été modifié et validé par T2 après le début de T1.
Donc on abandonne T1. Seule T2 est traitée Etat après 2.1, 2.2 : [1, 10] [2, 25]
Supplément de réponse : S4 2.1, 1.1, 2.2, 1.2, 1.3
Niveau read committed
Etat vu par T2 après 2.1 : [1, 10] [2, 25]
Etat vu par T1 après 1.1 [1, 60] [2, 20]
Etat vu par T2 après 2.2 [1, 10] [2, 25]
Etat vu par T1 après 2.2 [1, 60] [2, 25]
Etat vu par T1 après 1.2, 1.3 [1, 60] [2, 35]
Niveau sérializable; 1.2 est refusée (idem séquence S3)
Question 3. On complète T2 en ajoutant une nouvelle instruction qui succède à l'instruction 2.1 (et précède la validation de T2). Donner un exemple de nouvelle instruction SQL pouvant provoquer un interblocage.
Toute update qui modifie seulement le 1er tuple . Par ex:
Update R set b=1 where a=1;
Ou
Update R set b=1 where b=10; (initialement, l'attribut b du 1er tuple vaut 10) Réponse erronée :
La mise à jour de tous les tuples de R. Cette instruction attend
avant d'être exécutée d'obtenir tous les verrous sur les tuples de R, mais cela ne provoque pas d'interblocage
Update R set b=1 (sans clause where) Autres réponses erronées :
Update R set b=1 where a=2;
ou
Update R set b=1 where b=20;
Par la suite, on appelle Instr cette nouvelle instruction. Parmi les séquences suivantes lesquelles provoquent un interblocage ? Répondre en cochant la case et justifier ainsi :
- s'il y a un interblocage, lister les blocages qui en sont la cause.
- sinon compléter la séquence avec les instructions 1.3 et 2.2 de validation, puis écrire la séquence dans l'ordre d'exécution des instructions.
Séquence: 1.1, 1.2, 2.1, Instr
Interblocage ? oui
non
Justification: blocages : ordre d'exécution : ... ..., ..., ..., ..., ..., ...
Non T1 obtient tous ses verrous avant que T2 ne commence.
T1 doit valider pour que T2 puisse s'exécuter Séquence: 1.1, 2.1, 1.2, Instr
Interblocage ? oui
non
Justification: blocages : ordre d'exécution : ... ..., ..., ..., ..., ..., ...
Oui, T1 attend que T2 relâche le verrou sur le tuple a=2 puis T2 demande le verrou sur le tuple a=1 détenu par T1
T1 reçoit le message signalant l'interblocage Séquence: 2.1, 1.1, Instr, 1.2
Interblocage ? oui
non
Justification: blocages : ordre d'exécution : ... ..., ..., ..., ..., ..., ...
Oui, T2 attend que T1 relâche le verrou sur le tuple a=1 puis T1 demande le verrou sur le tuple a=2 détenu par T2
T2 reçoit le message signalant l'interblocage Séquence: 2.1, Instr, 1.1, 1.2
Interblocage ? oui
non
Justification: blocages : ordre d'exécution : ... ..., ..., ..., ..., ..., ...
Non T2 obtient tous ses verrous avant que T1 ne commence.
Exercice 3 : Contrôle de concurrence 3 pts
La BD d'une application de vente est constitué de la relation Vente (nv, prix, jour) nv est le numéro d'une vente (clé)
Question 1 : Soit la transaction V d'un vendeur qui insère une nouvelle vente avec un nouveau numéro.
Soit x une variable locale au terminal d'un vendeur.
a) x Å select max(nv) from Vente; on affecte la variable x avec le résultat de la requête b) insert into Vente ( x + 1, 10, '01 avril 2005'); l'insertion utilise la valeur de la variable x
c) commit;
Deux transactions V1 et V2 de type V s'exécutent simultanément. On note V1a, V1b, V1c les instructions a) b) c) de V1 respectivement et V2a, V2b, V2c celles de V2.
La séquence : V1a, V2a, V1b, V1c, V2b provoque une erreur : V2b est refusée car elle ne respecte pas la contrainte d'unicité de nv. Expliquer pourquoi, en une seule phrase ?
Question complémentaire
b) La séquence suivante s'exécute-t-elle entièrement ? V1a, V2a, V1b, V2b, V1c
V1 insère une nouvelle vente: [x, ..., ...] dans Vente.
Une autre transaction V2 tente d'insérer une nouvelle vente [x, ..., ...] avec le même numéro de vente que celui choisi par V1. Or il ne peut y avoir 2 ventes avec le même numéro.
Complément
b) La séquence suivante s'exécute-t-elle entièrement ? V1a, V2a, V1b, V2b, V1c
Réponse : NON : V2B est en attente. La contrainte d'unicité est garantie par un index sur nv. L'insertion V2b ne provoque pas d'erreur mais une attente du VX sur l'index, détenu par T1.
Lorsque V1 valide : V1c, alors V2 reçoit un message d'erreur car l'unicité n'est pas respectée.
Modifier ou compléter l'instruction a) de V pour éviter ce refus.
Solution 1 :
Verrouiller la Vente qui a le plus grand numéro
x Å select nv from Vente where nv = (select max(nv) from Vente) FOR UPDATE
Rmq : la réponse suivante n'est pas correcte :
x Å select max(nv) from Vente FOR UPDATE
car la clause for update s'applique seulement aux requêtes dont le résultat est un sous ensemble d'une relation (et sans aggrégation).
Solution 2 a) : rien
b) insert into Vente (1 + (select max(nv) from Vente), 10, '01 avril 2005');
Solution 3
a) lock table Vente; x Å select max(nv) from Vente;
Question 2 : On complète la BD avec une nouvelle relation M(n) contenant initialement un seul tuple [0].
On considère maintenant la transaction T : a) update M set n= n+1;
b) x Å select n from M;
c) insert into Vente ( x , 10, '01 avril 2005');
d) update Vente set prix = prix*0,8 where nv = x ; remise de 20% sur la vente
e) commit;
2 transactions T1 et T2 de type T s'exécutent simultanément.
La séquence suivante peut-elle s'exécuter dans cet ordre? Sinon, indiquer l'ordre d'exécution des instructions.
T1a, T1b, T2a, T2b, T1c, T1d, T1e, T2c, T2d, T2e
Non. La séquence ne peut pas s'exécuter dans cet ordre
Instruction T2a : T2 attend que T1 relâche le VX sur le tuple de M Ordre : toutes les instr. de T1 puis toutes les instr. de T2
On distingue les ventes courtes des ventes longues selon la durée de la négociation avec le client avant de lui accorder une remise. Soit t le délai entre la fin de l'étape c) et le début de l'étape d) :
t = 10 secondes pour une vente courte, t = 10 minutes pour une vente longue.
Compléter l'instruction b) pour que plusieurs ventes rapides ne puissent jamais être bloquées par une longue négociation en cours avec un client.
Solution
Le blocage est dû au VX sur M
Relâcher le VX sur M dès que possible, lorsque le numéro unique de la nouvelle vente est connu.
Objectif: relacher le VX sur M avant la négociation qui peut durer 10 minutes.
b) x Å select n from M; commit;
Cela revient à découper T en 2 transactions.
Exercice 4 : SQL3 Schéma, création de types, références, héritage 5 pts
On propose de concevoir le schéma d’une base de données permettant la gestion du matériel informatique d’une petite société. La base de données permet de décrire chacun des ordinateurs de l’entreprise.L’exercice consiste en la création du schéma de cette BD. Il sera éventuellement nécessaire de créer des types intermédiaires même si l’exercice ne le précise pas.
Question 1 : On définit les objets suivants:
• Un écran est constitué d’un numéro de série et d’une taille (sous forme d’un nombre entier)
• Un disque dur est constitué d’un numéro de série, d’une marque et d’une capacité
• Une imprimante est constituée d’un numéro de série d’un nom et d’une adresse IP ; une
adresse IP est constituée de 4 nombres de 3 chiffres maximum, séparés par des . (par exemple : 127.45.63.129)
Ecrire en SQL 3 la définition des objets décrits
Type(s) « supplémentaire(s) » :
CREATE TYPE IPAdress AS OBJECT ( n1 NUMBER(3),
n2 NUMBER(3), n3 NUMBER(3), n4 NUMBER(3) );
Type Ecran :
CREATE TYPE Ecran AS OBJECT ( serie NUMBER(10), taille NUMBER(2) );
Type Disque :
CREATE TYPE Disque AS OBJECT (
serie NUMBER(10), marque VARCHAR2(50), taille NUMBER(4) );
Type Imprimante :
CREATE TYPE Imprimante AS OBJECT ( serie NUMBER(10),
nom VARCHAR2(50), adresse IPAdress );
Question 2 : Définir un type Périphérique définissant des périphériques supplémentaires (Clavier, souris, etc…). Un périphérique est constitué d’un numéro de série et d’un genre de périphérique (sous forme de chaîne de caractère). Définir ensuite un type Souris et un type Clavier : Une souris est un périphérique avec un attribut supplémentaire indiquant de quelle sorte de souris il s’agit (« Optique » ,
«Normale », « TrackBall »,……). Un clavier possède quant à lui une information sur le type de clavier (« AZERTY », « QWERTY », ….)
Type périphérique :
CREATE TYPE Peripherique AS OBJECT ( serie NUMBER(10),
genre VARCHAR2(10) );
Type Souris :
CREATE TYPE Souris UNDER Peripherique (
typeDeSouris VARCHAR2(20) );
Type Clavier :
CREATE TYPE Clavier UNDER Peripherique (
typeDeClavier VARCHAR2(20) );
Question 3 : Définir le type ordinateur : un ordinateur est constitué d’un numéro de série, d’un nom et d’une adresse IP. Chaque ordinateur possède un écran et un ou plusieurs disques durs et éventuellement des périphériques (disques et périphériques n’appartiennent qu’à un et un seul ordinateur). Chaque ordinateur peut être connecté à une ou plusieurs imprimantes ; plusieurs ordinateurs peuvent être connectés à la même imprimante.
1) Dessiner le schéma entité association correspondant à cette description
2) Ecrire le type ordinateur en SQL3
CREATE TYPE EnsPeripheriques AS VARRAY(10) Of Peripherique;
CREATE TYPE EnsDisques AS VARRAY(10) OF Disque;
CREATE TYPE EnsImprimantes AS VARRAY(10) OF REF Imprimante;
CREATE TYPE Ordinateur AS OBJECT ( per EnsPeripheriques, ecr Ecran,
dis EnsDisques,
impri EnsImprimantes, serie NUMBER(10), nom VARCHAR2(50), ip IPAdress
);
Question 4 : Définir une table LesOrdinateurs permettant le stockage de l’ensemble des ordinateurs de l’entreprise.
CREATE TYPE LesOrdinateurs AS TABLE OF Ordinateur;
Question 5 : La table LesOrdinateurs est-elle suffisante pour stocker tous les objets de la base ? Justifiez votre réponse et définissez, si besoin, les autres tables nécessaires.
Non, il faut aussi une table d’imprimantes (vues les références)
Exercice 5 : Insertions et Requêtes 6 pts
Soit le schéma suivant en SQL 3 :
CREATE TYPE Employe AS OBJECT ( nom VARCHAR2(50), prenom VARCHAR2(50), numero NUMBER(5), salaire NUMBER(6) );
CREATE TYPE LesEmployes AS VARRAY(50) Of Employe;
@compile
CREATE TYPE Departement AS OBJECT ( Code NUMBER(5), Nom VARCHAR2(50), Budget NUMBER(10), membres LesEmployes );
@compile
CREATE TYPE Installation AS OBJECT ( dat DATE,
dept REF Departement );
@compile
CREATE TYPE LesInstallations AS VARRAY(50) OF Installation;
@compile
CREATE TYPE Logiciel AS OBJECT ( nom VARCHAR2(50), prix NUMBER(6), installes LesInstallations );
@compile
CREATE TABLE EnsDepartements OF Departement;
CREATE TABLE EnsLogiciels OF Logiciel;
Question 1 (insertion): Ecrire en SQL3 les requêtes suivantes 1.1) Insérer :
• le département « Informatique » de code 10521, dont le budget est de 100 000 euros, qui possède deux employés :
o Gérard Dupont (numéro 1) dont le salaire est de 15 000 euros/an o Pierre Durand (numéro 2) dont le salaire est de 23 000 euros/an
• et le département « Comptabilité » de code 23652, dont le budget est de 20 000 euros, qui possède un employé :
o Jean Martin (numéro 3) dont le salaire est de 12 000 euros/an
INSERT INTO EnsDepartements VALUES ( Departement(10521,
'Informatique',
100000, LesEmployes(
Employe('Dupont','Gerard',1,15000), Employe('Durand','Pierre',2,23000)
)
));
INSERT INTO EnsDepartements VALUES (
Departement(23652, 'Comptabilite',
20000,
LesEmployes(
Employe('Martin','Jean',3,12000) )
)
);
1.2) Insérer le logiciel « Word » dont le prix est de 13 000 euros/an qui n’a pas été installé
INSERT INTO EnsLogiciels VALUES ( Logiciel('WORD',13000,NULL));
1.3) Insérer le logiciel « Oracle » dont le prix est de 30000 euros/an et qui a été installé dans le département « Informatique » le 12-03-2005
INSERT INTO EnsLogiciels VALUES (
Logiciel('ORACLE',30000,LesInstallations(Installation('12-03-2005',(SELECT REF(j) FROM EnsDepartements j WHERE j.nom='Informatique')))));
1.4) Ajouter l’installation du logiciel Oracle dans le département Comptabilité au 15-04-2005
INSERT INTO
TABLE(SELECT t.installes FROM EnsLogiciels t WHERE t.nom='ORACLE') VALUES
(Installation('15-04-2005',(SELECT REF(j) FROM EnsDepartements j WHERE j.nom='Comptabilite')));
Question 2 : Ecrire les requêtes suivantes en SQL3
2.1) Sélectionner les départements dont le budget est supérieur à 50000 euros
SELECT t.nom FROM EnsDepartements t WHERE t.Budget > 50000;
2.2) Sélectionner les noms et numéros des départements dont l’un des employés gagne plus de 20 000 euros
SELECT t.nom,t.code FROM EnsDepartements t WHERE EXISTS (
SELECT m.nom FROM TABLE(t.membres) m WHERE m.salaire > 20000);
2.3) Sélectionner les départements dans lesquels le logiciel ORACLE est installé
SELECT DEREF(t.dept) INTO dpt FROM TABLE( SELECT l.installes FROM EnsLogiciels l WHERE l.nom='ORACLE') t;
2.4) Expliquer ce que fait la requête suivante :
SELECT dept.nom
FROM EnsDepartements dept, EnsDepartements dept2
WHERE dept.Budget=dept2.Budget AND dept2.nom='Ressources Humaines';
Elle sélectionne les noms des départements dont le budget est le même que celui du département Ressources Humaines.