Interrogation SGBD (TD) avac coorection
Exercice 1 :
Appliquer l’algorithme de verrouillage à deux phases sur les ordonnancements suivantsv R1(A) W1(B) W3(A) R2(B) R3(B) W3(B) W1(B) R2(A)
vR1(A) R3(B) W1(B) W4(A) W5(A) R2(D) R3(D) W2(D) W5(D) R4(E) R5(E)
- Vérifier dans chaque cas l’existence de deadlock, montrer comment le résoudre et montrer l’ordre d’exécution des transactions.
- Appliquer l’algorithme d’estampillage sur l’ordonnancement suivant :
- R2(B) R1(A) W2(C) W2(B) R3(B) R3(C) R1(B) W1(A) W3(B) W1(B) W3(C)
Action.
solution:
Action
|
Demande
|
Accord
|
Après fin T1
|
R1(A)
|
S1(A)
|
ok
|
-
|
W1(B)
|
X1(B)
|
ok
|
-
|
W3(A)
|
X3(A)
|
Non, T3 attend T1
|
Ok
|
R2(B)
|
S2(B)
|
Non, T2 attend T1
|
Ok
|
R3(B)
|
-
|
Ok
| |
W3(B)
|
-
|
Non, T3 attend T2
| |
W1(B)
|
X1(B)
|
Ok, Fin T1, U(A,B)
|
-
|
R2(A)
|
-
|
Non, T2 attend T3
|
Il existe un deadlock. Annuler soit T2 ou T3. On choisit par exemple d’annuler T2 qui n’a pas fait de mise à jour. L’ordre d’exécution devient : T1, T3, T2.
Action
|
Demande
|
Accord
|
Après fin T3
|
Après fin T4
|
R1(A) R3(B) W1(B) W4(A) W5(A) R2(D)
R3(D) W2(D) W5(D) R4(E) R5(E)
|
S1(A) S3(B) X1(B) X4(A) X5(A) S2(D)
S3(D) X2(D) X5(D) S4(E) S5(E)
|
Ok
Ok
Non, T1 attend T3
Non, T4 attend T1
Non, T5 attend T1
Ok
Ok, fin T3, U(B, D)
|
Ok, Fin T1, U(B)
Ok
Non, T5 attend T4
Ok, Fin T2, U(D)
-
Ok, Fin T4, U(A, E)
|
Ok
ok
Ok, Fin T5, U(A,D,E)
|
Ordre d’exécution :
T3, T1, T2, T4, T5
Application de l’algorithme d’estampillage
EL(A)
|
EE(A)
|
EL(B)
|
EE(B)
|
EL(C)
|
EE(C)
|
||||||
R2(B) R1(A) W2(C) W2(B) R3(B) R3(C)
R1(B) W1(A) W3(B) W1(B) W3(C)
|
0
0
1
1
1
1
1
1, Annuler T1
-
1
-
1
|
0
0
0
0
0
0
0
0
0
0
0
0
|
0
2
2
2
2
3
3
3
3
3
3
3
|
0
0
0
0
2
2
2
2
2
3
3
3
|
0
0
0
0
0
0
3
3
3
3
3
3
|
0
0
0
2
2
2
2
2
2
2
2
3
|
|||||
Après la relance de T1
|
|||||||||||
R4(A)
|
4
|
0
|
3
|
3
|
3
|
3
|
|||||
R4(B)
|
4
|
0
|
4
|
3
|
3
|
3
|
|||||
W4(A)
|
4
|
4
|
4
|
3
|
3
|
3
|
|||||
W4(B)
|
4
|
4
|
4
|
4
|
3
|
3
|
Exercice 2 :
Supposons
le schéma de la BD « Laboratoire de Recherche » traitée en TP.
Laboratoire (CodeLab,
NomLab, Chef_de_Lab*, Date-création, Siteweb).
Chercheur (NumCh,
NomCh, CodeLab*, CodeUniversité*)
Université (CodeUniversité,
NomUniversité)
Projet (CodePrj,
Date-Début, Date-fin, Responsable, TypePrj*, Budget)
TypeProjet (CodeTypePrj,
Libellé)
Paraticipe (NumCh*,CodePrj*,
Charge_Horaire).
Un
utilisateur (SGBD2011) veut exécuter deux requêtes SQL suivantes :
R1 :
SELECT NomLab
from SGBD.Laboratoire L, Chercheur C, SGBD.Participe R
where L.CodeLab=C.CodeLab and R.NumCh=C.NumCh and
R.Charge_Horaire>100
R2 :
UPDATE SGBD.CHERCHEUR SET Code_Université = ‘ESI’ where Code_université =’INI’.
- Donner toutes les vérifications effectuées par le SGBD pour répondre à cette requête (2+2).
- Pour chaque vérification, donner la requête que le SGBD pourra utiliser pour la réaliser (1+1).
- Dans le cas où la vérification échoue, proposer une solution que l’administrateur de la base de données pourra appliquer (1+1).
- Ecrire une procédure PlSQL qui permet à partir d’un numéro de chercheur, de calculer sa charge horaire totale (2).
solution:
Requête
|
R1
|
R2
|
Vérifications
|
1. Vérification lexico-syntaxique
2. L’existence des tables
Laboratoire et Participe chez l’utilisateur SGBD
3. L’existence de la table
Chercheur chez l’utilisateur SGBD2011
4. L’existence des attributs des
trois tables
5. Le privilège SELECT sur
Laboratoire et Participe pour l’utilisateur SGBD2011
|
1. Vérification lexico-syntaxique
2. L’existence de la table Chercheur
chez l’utilisateur SGBD
3. L’existence de l’attribut
Code_Université dans la table Chercheur
4. Le privilège UPDATE sur
Chercheur pour l’utilisateur SGBD2011
|
Requêtes SGBD
|
1. Consulter le lexique et la
grammaire SQL
2. SELECT Table_Name From ALL_USER
where Owner=’SGBD’
3. SELECT Table_Name From ALL_USER
where Owner=’SGBD2011’
4. SELECT Table_Name, Column_name
FROM ALL_TAB_COLUMNS Where Owner in (‘SGBD’, ‘SGBD2011’) and Table_Name
in(‘Laboratoire’,’Participe’,’Chercheur’) Order By Table_Name
5. SELECT Privilege FROM
ALL_TAB_PRIVS WHERE GRANTEE=’SGBD2011’ and Table_Name in (‘Laboratoire’,
‘Participe’) and Table_Schema=’SGBD’.
|
1. Consulter le lexique et la
grammaire SQL
2. SELECT Table_Name From ALL_USER
where Owner=’SGBD’.
3. SELECT Table_Name, Column_name
FROM ALL_TAB_COLUMNS Where Owner =‘SGBD’ and Table_Name = ’Chercheur’
4. SELECT Privilege FROM
ALL_TAB_PRIVS WHERE GRANTEE=’SGBD2011’ and Table_Name =’Chercheur’ and
Table_Schema=’SGBD’.
|
Solution
|
1. Corriger les erreurs lexicales
et syntaxiques
2. Vérifier si le nom des tables
est bien saisi. Corriger les noms ou bien créer la table correspondante
|
1. Corriger les erreurs lexicales
et syntaxiques
2. Vérifier si le nom de la table
est bien saisi. Corriger le nom ou bien créer la table
|
Programme plSQL :
CREATE OR REPLACE FUNCTION CalculeCharge(number NCH)
cursor cr is select Charge_Horaire from CHERCHEUR where NumCh=NCH;
c_rec cr%rowtype;
ChargeH binary_integer;
SansCharge EXCEPTION;
BEGIN
ChargeH := 0;
for c_rec in cr loop
ChargeH := ChargeH + c_rec.Charge_Horaire;
exit when cr%notfound;
end loop;
if(ChargeH =0) then RAISE SansCharge;
else
RETURN ChargeH ;
end if;
EXCEPTION WHEN SansCharge THEN
dbms_output.put_line (‘Attention! Le Chercheur N° ' ||NCHi||' est sans charge’);
END
0 commentaires:
Enregistrer un commentaire