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 [Link] <= sysdate and sysdate < [Link] and [Link] < 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 [Link] = 'Msila and not exists
( select * from Travaille t where p.#projet = t.#projet and [Link] =>
1/1/2006 and 1/1/2007 > [Link] and [Link] <> 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 [Link] < [Link] and [Link] > [Link] )
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 ([Link] is not null)
DECLARE
num integer;
BEGIN
num:=0;
SELECT numlabo
INTO num
FROM laboratoire
WHERE numlabo=:[Link];
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 ([Link] is not null)
DECLARE
num integer;
BEGIN
num:=0;
SELECT numprof INTO num
FROM projet
WHERE numprojet=:[Link];
IF num= 0 then raise_application_error(-20501, ce projet nexiste pas)
ELSE
IF (num<>:[Link]) 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 ([Link] is not null)
DECLARE
Somme, lbudget float;
BEGIN
SELECT sum ([Link] * [Link]) INTO somme
FROM projet P , labo-projet LP
WHERE [Link]= [Link] and [Link]=: [Link] and
[Link]=:[Link];
SELECT budget into lbudget FROM laboratoire L where L. numlabo= :[Link];
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 [Link] ;
Relationship diriger : List projet Inverse [Link] ;
Relationship participer : laboratoire Inverse [Link] ;
Relationship chef : laboratoire Inverse [Link] ; }
}
Class doctorant Extent Lesdoctorants Key NumEt
{ Attribute NumEt: Int ;
Attribute Nom : String ;
Relationship encadreur : professeursInverse [Link] ;
Relationship participant : projet Inverse [Link] ; }
Class laboratoire Extent Les laboratoires Key numlabo
{ Attribute numlabo : Int ;
Attribute nomlabo : String ;
Attribute budget : float ;
Relationship membre : List professeur Inverse [Link] ;
Relationship superviseur : professeur Inverse [Link] ;
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 [Link] ;
Relationship directeur : professeur Inverse [Link] ; }
Class labo-projet Extent Lesprojets-labs
{ Attribute pourcentage : INT ;
Relationship labo : laboratoire Inverse [Link] ;
Relationship prj : projet Inverse [Link] ;}
2.a-Donnez les titres de projets raliss par le laboratoire XXX.
SELECT [Link]
FROM LP in LesProjets-Labs
Where [Link]=XXX;
2.b-Donnez les professeurs qui ne supervisent que les projets raliss 100 % par son
laboratoire .
b.1- SELECT [Link]
FROM P in Projet
WHERE for all x in [Link]:
[Link] = 100 and [Link]=[Link];
ou
b.2-SELECT [Link]
FROM P in Projet
WHERE not exist ( select X from X in lesprojets-abs where [Link]=p and [Link]<>
[Link]);