Vous êtes sur la page 1sur 4

Correction TD7 –SGBDR-

1) create database DSI2

USE DSI2

Create table filiere (


idfiliere int primary key,
nomfil varchar(25) );

Create table stagiaire (


idstagiaire int primary key identity(1,1),
nom varchar(25),
prenom varchar(25),
idfiliere int foreign key references filiere(idfiliere),
totalabsence int default 0 );

Create Table Module (


idMod int primary key,
nomMod varchar(25),
MasseHoraire int );

Create table Fil_Module (


idf int foreign key references filiere(idfiliere),
idM int foreign key references module(idmod),
primary key (idf,idM) );

Create table absence (


idabs int primary key,
dateabs datetime,
ids int foreign key references stagiaire(idstagiaire),
idM int foreign key references module(idMod),
Typeabsence varchar(30) check (Typeabsence in ('justifiée','non justifiée') ))

2) insert into filiere values (1,'dsi1'),


(2,'dsi2');

Insert into stagiaire values ('n1','p1',1,0),


('n2','p2',1,0),
('n3','p3',2,0),
('n4','p4',2,0);
Insert into module values (1,'sql',140),
(2,'mobile',100),
(3,'php',120),
(4,'java',120);
PROF RACHID OMARI
Insert into fil_module values (1,1),
(1,4),
(2,1),
(2,3);

Une absence doit incrémenter automatiquement le total absence du


stagiaire. Donc on a deux ordres qui doivent être considérés comme
une seule unité, c’est pour cela on doit utiliser une transaction :

select * from stagiaire

begin transaction
declare @e int;
set @e=0 ;
Insert into absence values(2,'12-02-2019 10:30',1,1,'justifiée');
set @e+=@@error;
Update stagiaire
set TotalAbsence+=1
where idstagiaire=1
set @e+=@@ERROR;
If (@e=0)
commit;
else
rollback;

select * from absence

@@ERROR : Retourne 0 si l'instruction Transact-SQL précédente n'a rencontré aucune


erreur.
C’est à dire :
@@ERROR donne des valeurs diffèrent de 0 si la requête exécutée est
fausse, et elle donne la valeur 0 si la requête est bien exécutée.

On ajoute une insertion non justifiée :

begin transaction
declare @e int;
set @e=0 ;
Insert into absence values(3,'12-03-2019 10:30',1,3,'Non
justifiée');
set @e+=@@error;
Update stagiaire
PROF RACHID OMARI
set TotalAbsence+=1
where idstagiaire=1
set @e+=@@ERROR;
If (@e=0)
commit;
else
rollback;

3) Create view V3
as (
select ids, count(*) as Nbreabsence
from absence
where Typeabsence='non justifiée'
group by ids )

select * from v3

4) select * from stagiaire


where idstagiaire not in (select idstagiaire from V3);

5) select a1.ids
from absence a1,absence a2
where a1.idabs<>a2.idabs and a1.ids=a2.ids and
datediff(day,a1.dateAbs,a2.dateAbs)<15 and
datediff(day,a1.dateAbs,a2.DATEAbs)>=0
group by a1.ids
having count(a1.ids)>2

On a utilisé having count(a1.ids)>2 pour que le stagiaire soit être répéter plus de deux fois.

6) Create view V4
as (
select ids, count(*) as Nbreabsence
from absence
where Typeabsence='non justifiée'
group by ids )

SELECT * FROM V4

create view V5
as
select ids,count(*) as Nbre_absence
from Absence
where TypeAbsence ='justifiée'
PROF RACHID OMARI
group by ids

SELECT * FROM V5

PROF RACHID OMARI

Vous aimerez peut-être aussi