Vous êtes sur la page 1sur 3

Universit de Msila Anne Universitaire : 2009/2010

Facult des sciences de lingnieur 30 Mai 2010 dure : 1h et 30


Spcialit : Master1 Module : BDDA
Corrig-type
Questions de cours ( 5 pts) : consultez le support de cours.
Exercice 1 :base de donnes temporelles( 5pts):
1- Donner le nom, prnom et adresse des employs qui dirigent actuellement un projet
qui est actif et dont la fin du projet arrive avant le 31 dcembre 2010.
select nom, prnom, adresse from Employ e, Dirige d, Projet p
where e.#employ = d.#employ and d.#projet = p.#projet
and p.fromDate <= sysdate and sysdate < p.toDate and p.toDate < 31-12-2010;

2- Donner les numros des projets localiss Msila tels que tous les employs qui y ont
travaill pendant l'anne 2006 le faisaient 100%.
select p.#projet
from Projet p
where p.localisation = 'Msila and not exists
( select * from Travaille t where p.#projet = t.#projet and t.fromDate =>
1/1/2006 and 1/1/2007 > t.toDate and t.pourcentage <> 100 );

3- Donner le numro des projets dans lesquels chaque employ qui y a travaill n'a
jamais diminu son pourcentage.
select #projet
from Projet P
where not exists
( select * from Travaille T1, Travaille T2 where T1.#employ= T2.#employ
and T1.#projet = P.#projet and T2.#projet = P.#projet
and T1.toDate < T2.fromDate and T1.pourcentage > T2.pourcentage )
Exercice 2 :base de donnes Active( 5pts):
1- vrifier que le labo dun projet existe bien.
CREATE TRIGGER verification
AFTER INSERT OR UPDATE OF numlabo ON Labo-projet
FOR EACH ROW WHEN (new.numlabo is not null)
DECLARE
num integer;
BEGIN
num:=0;
SELECT numlabo
INTO num
FROM laboratoire
WHERE numlabo=:new.numlabo;
IF (num=0)
THEN raise_application_error(-20501, 'N de labo inexistant');
END IF; END;
2- un doctorant doit travailler dans un projet dirig par son encadreur.
CREATE TRIGGER doct-project
AFTER INSERT OR UPDATE OF projet ON doctorant
FOR EACH ROW WHEN (new.numprojet is not null)
DECLARE
num integer;
BEGIN
num:=0;
SELECT numprof INTO num
FROM projet
WHERE numprojet=:new.numprojet;
IF num= 0 then raise_application_error(-20501, ce projet nexiste pas)
ELSE
IF (num<>:new.numprof) THEN raise_application_error(-20501, ce doctorant doit
travailler dans le meme projet de son encadreur);
END IF; ENDIF;
END;
3- La somme des cots des projets dun labo ne dpasse pas le budget de ce dernier.
CREATE TRIGGER budget
BEFORE INSERT OR UPDATE OF projet ON labo-projet
FOR EACH ROW WHEN (new.numprojet is not null)
DECLARE
Somme, lbudget float;
BEGIN
SELECT sum (P.cout * LP.pourcentage) INTO somme
FROM projet P , labo-projet LP
WHERE P.numprojet= LP.numprojet and P.numprojet=: new.numprojet and
LP.numlabo=:new.labo;
SELECT budget into lbudget FROM laboratoire L where L. numlabo= :new.numlabo;
IF somme> lbudget then raise_application_error(-20501, le budget est dpass);
END IF;
END;
Exercice3 : Base de donnes Objet ( 5pts) :
1-Donner le schma de classes ODMG correspond au schma relationnel ci-dessus

Class Professeur Extent Les professeurs Key numprof
{ Attribute numprof : Int ;
Attribute noms : String ;
Relationship encadrer : List doctorant Inverse doctorant.encadreur ;
Relationship diriger : List projet Inverse projet.directeur ;
Relationship participer : laboratoire Inverse laboratoire.membre ;
Relationship chef : laboratoire Inverse laboratoire.superviseur ; }
}

Class doctorant Extent Lesdoctorants Key NumEt
{ Attribute NumEt: Int ;
Attribute Nom : String ;
Relationship encadreur : professeursInverse Professeur.encadrer ;
Relationship participant : projet Inverse projet.membredoc ; }

Class laboratoire Extent Les laboratoires Key numlabo
{ Attribute numlabo : Int ;
Attribute nomlabo : String ;
Attribute budget : float ;
Relationship membre : List professeur Inverse professeur.participer ;
Relationship superviseur : professeur Inverse professeur.chef ;
Relationship realiser : List labo-projet Inverse labo-projet .labo ; }
Class projet Extent Lesprojets Key numprojet
{ Attribute numprojet : Int ;
Attribute titre : String ;
Attribute cot : float ;
Relationship participe : List labo-projet Inverse l labo-projet .prj ;
Relationship membredoc : professeur Inverse doctorant.participant ;
Relationship directeur : professeur Inverse professeur.diriger ; }

Class labo-projet Extent Lesprojets-labs
{ Attribute pourcentage : INT ;
Relationship labo : laboratoire Inverse labo.realiser ;
Relationship prj : projet Inverse projet.participe ;}
2.a-Donnez les titres de projets raliss par le laboratoire XXX.
SELECT LP.Prj.titre
FROM LP in LesProjets-Labs
Where LP.Labo.nomlabo=XXX;
2.b-Donnez les professeurs qui ne supervisent que les projets raliss 100 % par son
laboratoire .

b.1- SELECT P.directeur
FROM P in Projet
WHERE for all x in P.Participe:
X.pourcentage = 100 and X.labo=P.directeur.labo;
ou
b.2-SELECT P.directeur
FROM P in Projet
WHERE not exist ( select X from X in lesprojets-abs where X.prj=p and X.labo<>
P.directeur.labo);