Drop Down MenusCSS Drop Down MenuPure CSS Dropdown Menu

Affichage des articles dont le libellé est sql_control. Afficher tous les articles
Affichage des articles dont le libellé est sql_control. Afficher tous les articles

mercredi 2 avril 2014

SGBD 1 : EFM avec Solution

4/02/2014 09:34:00 AM Posted by Ahmed

SGBD 1 : EFM  avec Solution

DUREE :   2h00                                                  BAREME :   ………../20
Exercice :

Soit le schéma relationnel suivant, représentant une gestion des comptes clients et leur emprunt dans une banque.
AGENCE (Num_Agence, Nom, Ville, Actif)
CLIENT (Num_Client, Nom, Ville)
COMPTE (Num_CompteNum_AgenceNum_Client, Solde)
EMPRUNT (Num_EmpruntNum_AgenceNum_Client, Montant)
Section 1 : Création de la base de données
1)Créez la base de données DB_Banque en spécifiant les paramètres de création.... (1 pts)
2)Créez toutes les tables avec les contraintes d’intégrité PK et FK, et ajouter un enregistrement par table.........................................................................................(3 pts)

Section 2 : Mise à jour des données :
1)Modifier la valeur Null des Soldes par la valeur 0............................................... (0,5 pts)
2)Modifier les villes des agences en majuscule........................................................ (0,5 pts)
3)Diminuer l'emprunt de tous les clients habitant “Casablanca” de “5%”................. (1 pts)
4)ajouter une contraint strictement positif (>) pour Solde........................................ (1 pts)

Section 3 : Requêtes d’interrogation de la base de données :
Formuler en SQL les requêtes suivantes, et vérifier à chaque fois que le résultat obtenu est sans doublon.
1)les clients ou le nom commence par B, et le troisième caractère est un A............ (0,5 pts)
2)Liste des agences ayant des comptes-clients........................................................ (0,5 pts)
3)Clients ayant un compte à “Casablanca”............................................................... (1 pts)
4)Clients ayant un compte ou un emprunt à “Rabat”............................................... (1 pts)
5)Clients ayant un compte à la ville où ils habitent................................................... (1 pts)
6)Client ayant un compte et emprunt dans la même agence..................................... (1 pts)
7)Solde moyen des comptes-clients de chaque agence............................................... (1 pts)
8)Totale solde par agence.......................................................................................... (1 pts)
9)le client qui a le plus grand total emprunt............................................................ (1,5 pts)
10)Clients ayant un emprunt dans toutes les agences de “Casablanca”.................... (1,5 pts)

Section 4 : les vues, créer les vues qui affiche les requêtes suivantes :
1)Une vue qui affiche les clients avec leur total solde et total emprunt................... (1,5 pts)
2)une vue qui affiche les agences avec un total emprunt supérieur au total Solde..........(1,5 pts)
Solution :

samedi 29 mars 2014

Examen de fin module : SGBD 1 Avec solution

3/29/2014 08:10:00 AM Posted by Ahmed
       OFPPT
 


         Direction Régionale Tensift Atlantique

               Etablissement : Ista Ntic Syba Marrakech

            Examen de fin module :    Gestion du Temps

             2011/2012

Filière:TDI                                                   Groupe(s):TDI2GE
Niveau : 2ème  année                                   Formateur : OUATOUCH Abdeljalil
Durée : 2h                                                Barème:    /20
                                                       
Au niveau national, la natation est un sport géré par la Fédération Marocaine de Natation, puis par des clubs au niveau des différentes villes du Royaume.

La fédération organise des entraînements de natation communs aux différents athlètes dans le but d’harmoniser les pratiques et de déceler les futurs talents. Ces entraînements communs nécessitent de disposer de créneaux horaires dans trois piscines différentes.

La fédération  souhaite mettre en place une gestion informatisée afin de contrôler que chaque athlète suit bien son plan d'entraînement personnalisé. Pour chaque athlète, le plan d'entraînement proposé définit la distance (exprimée en mètres) à parcourir pour chaque entraînement.
Pour assurer cette gestion, le schéma relationnel suivant a été établi :

ATHLETE(NumLicence, NomAthlete, PrenomAthlete, CategorieAthlete)
ENTRAINEMENT(NumEntrainement, DateEntrainement, HeureDebut, HeureFin, NumPiscine#)
PLAN_ENTRAINEMENT(NumEntrainement#, NumLicence#, DistanceAParcourir, DistanceParcourue)
PISCINE(NumPiscine, NomPiscine, AdressePiscine)

Les champs soulignés correspondent aux clefs primaires, les champs suivis du caractère # sont des clefs étrangères.
TRAVAIL À FAIRE
I.                    Création de la  base de données
1.       Créer la base de données sous SQL SERVER        2 pts
2.       Créer trois enregistrements par table

II.                Contraintes
1.      Les valeurs permises pour le champs CategorieAthlete sont (Catégorie1,Catégorie2,catégorie3) 0,5pts
2.      La distance parcourue doit être positives et inférieure ou égale à la distance à parcourir 1 pts




III.             Requêtes

1.      Afficher  la liste des  athlètes triés par ordre décroissant des catégories et ordre croissant de leur numéro de licence. 1pts

2.      Afficher la liste de piscines triées par ordre croissant des noms, les noms doivent avoir le premier caractère en majuscule et les adresses des piscines en minuscule 1,5 pts.

3.      Afficher les athlètes qui ont participés au plan d’entrainement numéro 20,  (nom,prénom,distanceparcourue,observation), le champs observation permettant d’afficher  le mot débutant si la distance parcouru est inférieure à 2000 m sinon on affiche le mot expert. 2 pts

4.      Afficher les piscines (numéro, nom,adresse) qui seront disponible pour le mois janvier de l’année 2012. 1,5 pts

5.      Créer une vue vue1 affichant le nombre d’athlète par catégorie. 1,5 pts

6.      Créer une vue vue2 affichant le total des distances parcourue au niveau des différents entrainements pour chaque athlètes (numéro athlète, total distance parcourue) 1,5 pts

7.      En utilisant la question N°6 afficher les athlètes dont la distance parcourue dans les différents entrainements est supérieur à 2000 m 1,5 pts

8.      Afficher les entrainements dont leur distance à parcourir est la valeur maximale. 1,5 pts

9.      Créer une vue vue3 permettant d’afficher la listes des entrainements suivis(numéro,date,heure début,heure fin,Nom piscine,Distance à parcourir, distance parcourue)pour chaque athlète. 1,5 pts

10.  Afficher  les athlètes qui ont participé à au moins 4 entrainements. 1,5 pts

11.  Créer une vue  vue4 affichant le nom de piscine le plus utilisé par les athlètes de la catégorie 1 (1,5 pts)


solution : Copier le script dans votre sql server pour qu'il s'affiche correctement bonne chance 

create database EFM_SGBDI

use EFM_SGBDI

--I/1

create table ATHLETE(
NumLicence int primary key, 
NomAthlete varchar(255), 
PrenomAthlete  varchar(255), 
CategorieAthlete  varchar(255)
)

create table ENTRAINEMENT(
NumEntrainement  int primary key, 
DateEntrainement date, 
HeureDebut int, 
HeureFin int, 
NumPiscine int foreign key references PISCINE(NumPiscine)
)


create table PLAN_ENTRAINEMENT(
NumEntrainement int foreign key references ENTRAINEMENT(NumEntrainement), 
NumLicence int foreign key references ATHLETE(NumLicence), 
DistanceAParcourir float, 
DistanceParcourue float,
constraint PK_PLAN_ENTRAINEMENT primary key(NumEntrainement,NumLicence)
)
create table PISCINE(
NumPiscine  int primary key, 
NomPiscine varchar(255), 
AdressePiscine varchar(255)
)

set language french

--I/2
insert into ATHLETE values (1,'Hillal','Abdessamad','Catégorie2')
insert into ATHLETE values (2,'Sahri','Anas','Catégorie1')
insert into ATHLETE values (3,'badir','Zaid','Catégorie3')
insert into ATHLETE values (4,'Dahmane','Brahim','Catégorie1')
insert into ATHLETE values (5,'Azrig','Abdelhaq','Catégorie2')

insert into PISCINE values (1,'Albaladi','Syba')
insert into PISCINE values (2,'Koutobiya','Jam3 Alfana')
insert into PISCINE values (3,'Alfarah','Dawdiyat')
insert into PISCINE values (4,'Alnour','Massira')

insert into ENTRAINEMENT values (1,'19/01/2010',1,6,1)
insert into ENTRAINEMENT values (2,'25/01/2010',6,8,2)
insert into ENTRAINEMENT values (3,'26/02/2010',7,10,1)
insert into ENTRAINEMENT values (4,'28/02/2010',12,16,3)
insert into ENTRAINEMENT values (6,'05/03/2010',2,5,2)
insert into ENTRAINEMENT values (20,'10/03/2010',8,12,2)
insert into ENTRAINEMENT values (7,'1/1/2011',14,16,3)
insert into ENTRAINEMENT values (8,'5/1/2012',15,17,1)
insert into ENTRAINEMENT values (8,'5/1/2012',15,17,1)

insert into PLAN_ENTRAINEMENT values (1,1,500,250)
insert into PLAN_ENTRAINEMENT values (2,1,300,200)
insert into PLAN_ENTRAINEMENT values (3,2,600,150) `
insert into PLAN_ENTRAINEMENT values (1,3,100,50)
insert into PLAN_ENTRAINEMENT values (4,1,400,250)
insert into PLAN_ENTRAINEMENT values (2,2,600,400)
insert into PLAN_ENTRAINEMENT values (20,4,250,150)
insert into PLAN_ENTRAINEMENT values (20,1,2400,2200)
insert into PLAN_ENTRAINEMENT values (7,4,3000,2200)
insert into PLAN_ENTRAINEMENT values (1,2,700,150)
insert into PLAN_ENTRAINEMENT values (7,2,900,500)
insert into PLAN_ENTRAINEMENT values (4,2,1500,1200)

--II
--1. Les valeurs permises pour le champs CategorieAthlete sont (Catégorie1,Catégorie2,catégorie3) 0,5pts
alter table  ATHLETE
add constraint CheckCat check(CategorieAthlete in ('Catégorie1','Catégorie2','Catégorie3'))

--2. La distance parcourue doit être positives et inférieure ou égale à la distance à parcourir 1 pts
alter table PLAN_ENTRAINEMENT
add constraint ChekDs check(DistanceParcourue > 0 and DistanceParcourue<= DistanceAParcourir)
--II. Requêtes

--1. Afficher  la liste des  athlètes triés par ordre décroissant des catégories et ordre croissant de leur numéro de licence. 1pts
select * from ATHLETE  order by CategorieAthlete desc,NumLicence asc
--2. Afficher la liste de piscines triées par ordre croissant des noms, les noms doivent avoir le premier caractère en majuscule et les adresses des piscines en minuscule 1,5 pts.
select NumPiscine,UPPER(LEFT(NomPiscine,1))+lower(RIGHT(NomPiscine,LEN(NomPiscine)-1)),lower(AdressePiscine) from PISCINE order by NomPiscine asc
--3
select a.NomAthlete,a.PrenomAthlete,p.DistanceParcourue,case 
when  p.DistanceParcourue  < 2000 then 'débutant'
else 'expert'  
end as 'observation'
from ATHLETE a, PLAN_ENTRAINEMENT p
where a.NumLicence = p.NumLicence and p.NumEntrainement = 20
--4. Afficher les piscines (numéro, nom,adresse) qui seront disponible pour le mois janvier de l’année 2012. 1,5 pts
select * from PISCINE where NumPiscine in (select NumPiscine from ENTRAINEMENT where MONTH(DateEntrainement) = 1 and YEAR(DateEntrainement) = '2012')
--5. Créer une vue vue1 affichant le nombre d’athlète par catégorie. 1,5 pts
create view  vue1 as (select CategorieAthlete,COUNT(*) as [Nombre ATHLETE] from ATHLETE group by CategorieAthlete)
select * from vue1 
--6. Créer une vue vue2 affichant le total des distances parcourue au niveau des différents entrainements pour chaque athlètes (numéro athlète, total distance parcourue) 1,5 pts
create view vue2 as (select a.NumLicence,SUM(p.DistanceParcourue) as [total_distances] from PLAN_ENTRAINEMENT p, ATHLETE a where p.NumLicence = a.NumLicence group by a.NumLicence)
select * from vue2
--7. En utilisant la question N°6 afficher les athlètes dont la distance parcourue dans les différents entrainements est supérieur à 2000 m 1,5 pts
select * from ATHLETE a, vue2 v where a.NumLicence = v.NumLicence and v.total_distances > 2000
-- 8. Afficher les entrainements dont leur distance à parcourir est la valeur maximale. 1,5 pts
select e.NumEntrainement,e.DateEntrainement,e.HeureDebut,e.HeureFin,p.NomPiscine 
from ENTRAINEMENT e, PISCINE p 
where e.NumPiscine = p.NumPiscine and NumEntrainement in ( select NumEntrainement  from PLAN_ENTRAINEMENT  where DistanceAParcourir >= all (select DistanceAParcourir from PLAN_ENTRAINEMENT))
--9. Créer une vue vue3 permettant d’afficher la listes des entrainements suivis(numéro,date,heure début,heure fin,Nom piscine,Distance à parcourir, distance parcourue)pour chaque athlète. 1,5 pts
select a.NomAthlete ,e.NumEntrainement,e.DateEntrainement,e.HeureDebut,e.HeureFin,ps.NomPiscine,SUM(p.DistanceAParcourir) as [DistanceAParcourir],SUM(p.DistanceParcourue) as [DistanceParcourue]
from ATHLETE a, PLAN_ENTRAINEMENT p, ENTRAINEMENT e, PISCINE ps
where a.NumLicence = p.NumLicence and e.NumEntrainement = p.NumEntrainement and ps.NumPiscine = e.NumPiscine
group by  a.NomAthlete ,e.NumEntrainement,e.DateEntrainement,e.HeureDebut,e.HeureFin,ps.NomPiscine
--10

select * from ATHLETE where NumLicence in ( select NumLicence from  PLAN_ENTRAINEMENT group by NumLicence having COUNT(*) >= 4)

--11. Créer une vue  vue4 affichant le nom de piscine le plus utilisé par les athlètes de la catégorie 1 (1,5 pts)

select ps.NomPiscine,COUNT(*)
from ATHLETE a, PLAN_ENTRAINEMENT p,ENTRAINEMENT e, PISCINE ps
where a.NumLicence = p.NumLicence and p.NumEntrainement = e.NumEntrainement and e.NumPiscine = ps.NumPiscine and a.CategorieAthlete = 'Catégorie1'
group by ps.NomPiscine having COUNT(*) >= all 
(select COUNT(*) from ATHLETE a, PLAN_ENTRAINEMENT p,ENTRAINEMENT e, PISCINE ps
where a.NumLicence = p.NumLicence and p.NumEntrainement = e.NumEntrainement and e.NumPiscine = ps.NumPiscine and a.CategorieAthlete = 'Catégorie1'
group by ps.NomPiscine )














Formateur




Directeur Pédagogique
Directeur du complexe/Directeur de l'EFP
Visa de La DRTA



Examen de fin de module : SGBDR I – THEORIE

3/29/2014 08:06:00 AM Posted by Ahmed
  Page 1 sur 2


       OFPPT
 
       Office de la Formation Professionnelle
     et de la Promotion du Travail
        Direction Régionale Tensift Atlantique
Etablissement : ISTA CITE DE L’AIR EL JADIDA
Examen de fin de module : SGBDR I – THEORIE
2009/2010
Filière: TDI                                              Groupe(s) :1
Niveau : TS
Durée : 2 Heures                  Barème:/20
 

Dossier 1 : (6 points)

1 - Définir le produit cartésien et donner un exemple. (1 point)
2 - Donner la syntaxe de création de la table Commande de la base "GESCOM"
COMMANDE (NUMCOM, CODECLI#, DATECOM) (3 point)
NB : cette syntaxe doit prendre en compte la notion de clé étrangère et aussi la contrainte qui
n’accepte que les dates de commandes postérieures au 1er janvier 2009.
3 - Définir les termes suivants : (2 points)
TRANSACTION, LMD, LCD

Dossier 2 : (14 points)

La Base de Données Relationnelle "GESCOM" est décrite par les schémas des relations
suivantes :
CLIENT (CODECLI, NOMC, CATC, VILC)
ARTICLE (CODEART, NOMA, COULEUR, PRIXACHAT, PRIXVENTE, QTESTK)
COMMANDE (NUMCOM, CODECLI#, DATECOM)
DETAILCOM (NUMCOM#, CODEART#, QTECOMD)
1.  Affichez la marge bénéficiaire de tous les articles. (1 point)
2.  Calculez le prix de vente moyen des articles de chaque couleur ; ordonnez le résultat
par couleur. (1 point)
3.  Donnez pour chaque catégorie de client le nombre total de clients. (1 point)
4.  Donnez le chiffre d'affaires réalisé pour chaque client. (1 point)
5.  Donnez  la  liste  des  codes  des  articles  qui  n'ont  pas  été  commandés  le  20  novembre
2005. (1 point)
6.  Recherchez tous les articles dont le prix de vente est supérieur à  celui de l'article de
code A100. (1 point)
  Page 2 sur 2

7.  Recherchez les articles de même couleur que l'article de code A100, et dont le prix de
vente est supérieur ou égal au prix moyen de tous les articles. (1 point)
8.  Donnez  la  liste  des  codes  des  articles  commandés  par  tous  les  clients  parisiens.  (1
point)
9.  Donnez  la  liste  des  codes  des  clients  ayant  commande,  dans  une  même  commande,
tous les articles rouges. (2 points)
10. Donnez  la  liste  des  codes  et  des  noms  des  clients  ayant  commandés  tous  les  articles
rouges, dans une même commande. (2 points)
11. Comment  accorder  le  droit  de  création  de  table  à  tous  les  utilisateurs  de  la  base
"GESCOM" en donnant le code Sql approprié ? (1 point)
12.  Comment est-il possible d'interdire à l'utilisateur Ahmed de la base de données "GESCOM", de
supprimer des clients ? (1 point)

Contrôle continue N°2 SGBD II Avec correction

3/29/2014 07:56:00 AM Posted by Ahmed
Contrôle continue N°2  SGBD II                      Durée : 1h30

Sur le schéma relationnel suivant :

Emp (num_emp, nom, prenom, salaire, prime, num_deparatement)
Dept (num_dept, libelle, chef) NB : chef est un employé

Questions :

Question 1 (4 pts) : 

Procédure 1 : Ajoutez une nouvelle colonne STARS varchar(100) par code , dans la table EMP qui permet de stocker des étoiles « * », Ecrire un programme qui récompense les employés en leur attribuant une étoile dans la colonne STARS par tranche de salaire de 1000DHs.

Question 2 (4 pts): 
Procédure 2 : lister les employés qui sont sous la direction d’un chef (dont le num du chef est
donnée par paramètre)
Question 3 (4 pts): 
 Ecrire une procédure stocké qui affiche le nombre d’employé dans un département donnée (en
paramètre) :
- s’il manque le paramètre, la procédure retourne 0




- si le département n’existe pas, la procédure stocké retourne 1
- si le département existe, la procédure stocké retourne 2 et affiche le nombre d’employé
Dkhal parametre code

Question 4  (4 pts) : 
Ecrire une fonction qui retourne les employés subordonné direct d’un employé donnée en
paramètre s’il est chef, sinon retourne -1
Question 5  (4 pts) :
Créer une fonction qui retourne une table qui prend en paramètre le numéro de département et produit une table  qui énumère les employés  de ce département .
·         Le nom des employés  est écrit en lettres majuscules
·         Les prénoms des employés commencent par une lettre majuscule

CCorrection :


s

create database CCN2_SGBDII

use CCN2_SGBDII

create table Emp(
num_emp int primary key, 
nom varchar(255), 
prenom varchar(255), 
salaire float, 
prime int, 
num_deparatement int foreign key references Dept(num_dept)
)
create table Dept(
num_dept int primary key, 
libelle varchar(255),
chef int
)

insert into Dept values(1,'Departement I',1)
insert into Emp values(1,'Hillal','Abdessamad',7000,2,1)

alter table Dept add constraint FK_Dept_Chef foreign key (chef) references Emp(num_emp)

insert into Dept values(2,'Departement II',1)
insert into Emp values(2,'Shari','Anas',8000,5,2)
insert into Emp values(3,'Sheriff','Abdelhaq',8000,4,2)
insert into Dept values(3,'Departement III',3)
insert into Emp values (4,'Dahmane','Brahime',6700,7,3,NULL)
insert into Emp values (5,'barik','Mohamed',4800,4,3,NULL)
insert into Dept values(4,'Departement IV',2)
insert into Emp values (6,'Badir','Zaid',7300,10,4,NULL)
insert into Dept values(5,'Departement V',4)


select * from Dept
select * from Emp

alter table Emp add  STARS varchar(100)

alter proc PS_1
As
begin
declare C1 cursor for (select num_emp,salaire from emp)
declare @n int, @s float
open C1
fetch next from C1 into @n, @s
while(@@FETCH_STATUS = 0)
begin
update Emp set STARS = REPLICATE('* ',cast(@s/1000 as int )) where num_emp = @n
fetch next from C1 into @n, @s
end
close C1
deallocate C1
end

exec PS_1
select * from emp


create proc PS_2(@chef int)
as
Begin
if  exists(select * from Dept where chef = @chef)
begin
select * from Emp where num_deparatement in (select num_dept from Dept where chef = @chef)
end
else
print 'N extist pas'
end

exec PS_2 1

create proc PS_3(@num_dept int = NULL)
As
Begin
Declare @res int 
if (@num_dept = NULL) 
set @res = 0
if not exists(select * from Dept where num_dept = @num_dept)
set @res = 1
else
begin
set @res = 2
select COUNT(*) from Emp where num_deparatement = @num_dept
end
return @res
end

exec PS_3 4


create function Fn_1(@chef int) returns int
As
begin
declare @nbr int
set @nbr = -1
if  exists(select * from Dept where chef = @chef)
begin
select @nbr = count(*) from Emp where num_deparatement in (select num_dept from Dept where chef = @chef)
end
return @nbr
end
select dbo.Fn_1(1)

alter function Fn_2(@num_deparatement int) returns @t table(nom varchar(255),prenom varchar(255))
As
begin
declare C2 cursor for (select nom,prenom from Emp where num_deparatement = @num_deparatement)
declare @n varchar(255), @p varchar(255),@temp varchar(255),@i int
open C2
fetch next from C2 into @n,@p
while(@@fetch_status = 0)
begin
select @temp = '',@i = 1
while(@i <= len(@p))
begin
if(@i = 1)
set @temp = @temp + upper(substring(@p,@i,1))
else
set @temp = @temp + substring(@p,@i,1)
set @i = @i + 1
end
insert into @t values(upper(@n),@temp)
fetch next from C2 into @n,@p
end
close C2
deallocate C2
return
end
select * from dbo.Fn_2(1)

Examen de fin module : SGBD II Avec Correction

3/29/2014 07:50:00 AM Posted by Ahmed
       OFPPT


Direction Régionale Tensift Atlantique

Etablissement : Ista Ntic Syba Marrakech

Examen de fin module :    SGBD II

2011/2012

Filière:TDI                                                                                         Groupe(s):               TDI2GE
Niveau : 2ème  année                                                                       Formateur : OUATOUCH Abdeljalil
Durée :2h30                                                                                     Barème:   /20
                                                                                             
Partie I : Programmation TSQL : (4 pts)
1)      En utilisant les fonctions :

-          ascii(caractère) permet de renvoyer le code ascii du caractère précisé en paramètre.
-          char (int) permet d’afficher le caractère dont le code ascii est l’entier précisé en paramètre.

Afficher tous les alphabets (majuscule et minuscule) en précisant pour chacun le code ascii. (1 pt).


2)      On considère la table :
 Livre (IdL int primary key, Titre varchar (4))
Créer un programme TSQL permettant de remplir cette table par 100 enregistrement sachant que :

(1 pt)
-          Le champ IdA est un compteur qui s’incrémente automatiquement,
-          Le champ Titre respecte le masque suivant : ‘Ti’ avec i est un entier compris entre 0 et 99.



3)      On rajoute sur la même base la table :

Livre_Old (IdL int primary key, Titre varchar (3))

On désire remplir cette table par le contenu de la table initiale en respectant les contraintes suivantes : (2 pts)
o   Un enregistrement ne doit pas figurer à la fois dans les deux tables.
o   Une fois la table Livre_Old est remplie la table Livre doit être vide.
o   Si l’opération de transfert de données a généré un problème, elle sera complètement annulée et on veillera à afficher un message pour l’utilisateur. « gestion d’erreurs »




Partie II  : Procédures stockées et Triggers (16 pts)

On considère l’exemple de la base de données suivante :
Cinéma (nomCinéma, numéro, rue, ville)
Salle (nomCinéma, noSalle, capacité, climatisée)
Horaire (idHoraire, heureDébut, heureFin, Durée)
Séance (idFilm, nomCinéma, noSalle, idHoraire, tarif)
Film (idFilm, titre, année, genre, résumé)
Acteur (idActeur, nom, prénom, DateNaissance)
Rôle (idActeur, idFilm, nomRôle)

1)      Réaliser la base de données sous le nom Projections. (1,5 pt)
2)      Remplir les tables avec des données correctes. (1,5 pt)

3)      Triggers : (6 pts)
a.       Chaque suppression d’un enregistrement de la table « Cinéma » ne doit pas s’effectuer mais s’affiche plutôt un message indiquant cela.
b.      Le champ « Nom » de la même table doit être en majuscule pour tous les champs de la table et le « Prénom » doit commencer par une lettre majuscule. (Acteur)
c.       Créer un (des) trigger(s) qui supprime (nt) en cascade après la suppression d'une cinéma
d.      La « Durée » doit se remplir automatiquement.
e.       Le « Tarif » de chaque séance ne doit pas dépasser 1000 DH.
f.       Créer un trigger qui affiche le type de chaque opération sur la table ainsi que le nombre des enregistrements concernés.

4)      Procédures : (7 pts)
a.       Ecrire une Procédure stockée qui, étant donné un acteur, affiche le nombre de films auxquels il a participé, utiliser un paramètre de sortie.
b.      Réaliser une procédure stockée qui permet de remplir la colonne Durée pour tous les enregistrements de la table en procédant aux vérifications suivantes :
                                                              i.      L’heure de début doit être inférieure à celle de fin
                                                            ii.      La durée maximale est de 5 heures ; en cas de non respect de cette condition, il faut afficher un message qui demande à l’utilisateur de ressaisir les données de l’enregistrement en question.
c.       Afficher sous forme de phrases le nombre de cinémas de chaque ville avec leurs salles. (Ordre croissant des villes)




d.      Ajouter une table Grp_Cin (code, description) contenant les groupes de familles comme suit :
-          Grp 1 :           Nombre de salles < = 1
-          Grp 2 :     1 < Nombre de salles < = 3
-          Grp 3 :     3 < Nombre de salles < = 5
-          Grp 4 :     5 < Nombre de salles
Créer une procédure stockée permettant de remplir cette table comme suit : ((1, Groupe1), (2, Groupe2)…)
e.       Ajouter une colonne CodeG comme clé étrangère dans la table « cinéma » ; puis réaliser une procédure stockée permettant de remplir cette colonne.

f.       Ajouter une table « Cinémas_Salles » qui a un schéma relationnel résultat de la combinaison du schéma de la 1ère et de la 2ème sans répétition des champs. Réaliser une procédure stockée qui permet de remplir cette table.

g.      Réaliser une procédure stockée qui permettra d’afficher l’état actuel d’un cinéma (passé en argument) en affichant les éléments suivants :

                                                              i.      Le plus court, le plus long et le plus cher film projeté à ce cinéma.
                                                            ii.      L’acteur qui a apparu le plus dans ce cinéma.
                                                          iii.      La durée totale de toutes les projections de ce cinéma.


Remarque :
            Le script des réponses doit être lisible, commenté et enregistré sur le bureau dans un dossier qui porte votre nom et votre groupe

Correction 

Create Database FEM_SGBDII

use FEM_SGBDII

/* Partie I : Programmation TSQL : (4 pts) */
--1
select char(65+32)

declare @i int
declare @t table (AlphaMaG varchar,ASCIIMaG int, AlphaMin varchar,ASCIIMin int)
set @i = 65
while(@i < 91)
begin
insert into  @t values (CHAR(@i), @i,CHAR(@i+32), @i+32)
set @i = @i+1
end
select * from @t

--2

 create table Livre(
IdL int primary key,
Titre varchar (4)
)
delete from Livre
declare @i int
set @i=0
while @i < 100
begin
insert into Livre values (@i+1,'T'+cast(@i as varchar(25)))
set @i = @i + 1
end
select * from Livre
--3
 create table Livre_OLD(
IdL int primary key,
Titre varchar (4)
)

declare old cursor for (select * from Livre)
open old
declare @id int, @titre varchar(255)
fetch next from old into @id ,@titre
while @@FETCH_STATUS = 0
begin
if not exists(select * from Livre_OLD where IdL=@id and Titre = @titre)
begin
begin tran a
insert into Livre_OLD values (@id,@titre)
delete from Livre where IdL=@id and Titre = @titre
commit a
end
fetch next from old int @id,@titre
end

xs






/* Partie II  : Procédures stockées et Triggers  */
create table Cinéma (
nomCinéma varchar(255) primary key,
numéro int,
rue varchar(255),
ville varchar(255)
)

create table Salle (
nomCinéma varchar(255),
noSalle int,
capacité int,
climatisée int
primary key (noSalle)
)
insert into Salle values('s',1,1,1)
create table Horaire (
idHoraire int primary key,
heureDébut time,
heureFin time,
Durée float
)
insert into Séance values(1,'alhillal',1,1,100000)
insert into Séance values(101,'alhillal',1,1,100000)
insert into Séance values(100,'alhillal',1,1,100)

create table Séance (
idFilm int foreign key references Film(idFilm),
nomCinéma varchar(255) foreign key references Cinéma(nomCinéma),
noSalle int foreign key references Salle(noSalle),
idHoraire int foreign key references Horaire(idHoraire),
tarif int,
primary key (idFilm,nomCinéma,noSalle,idHoraire)
)

create table Film (
idFilm int primary key,
titre varchar(255),
année int,
genre varchar(255),
résumé varchar(255)
)
insert into Film values (1,'Planet des signe',1995,'Science fiction','Monde des singes')
insert into Film values (2,'Avatar',2010,'Science fiction','autre vie')
insert into Film values (3,'Le petit monde de borweur',2012,'comique','monde de petit')
insert into Film values (4,'La rélité',2005,'drama','la fin de monde')

create table Acteur (
idActeur int primary key,
nom varchar(255),
prénom varchar(255),
DateNaissance date
)

create table Rôle (
idActeur int foreign key references Acteur(idActeur),
idFilm int foreign key references Film(idFilm),
nomRôle varchar(255)
primary key(idActeur,idFilm)
)

insert into Cinéma values('MegaRama',1,'Agdal','Casa')
insert into Cinéma values('Arif',2,'Dawdiyat','Marrakech')
insert into Cinéma values('Alhillal',3,'Sou9 Arabi3','Rabat')
insert into Cinéma values('Mabrouka',4,'Prince','marrakech')

insert into Rôle values (1,1,'Pressonage pricipal')
insert into Rôle values (2,1,'Scéane comique')
insert into Rôle values (3,1,'Combat')
insert into Rôle values (2,3,'Police')

insert into Salle values ('MegaRama',12,100,0)
insert into Salle values ('MegaRama',5,250,1)
insert into Salle values ('Arif',6,85,0)
insert into Salle values ('Alhillal',10,150,0)

insert into Horaire values (1,'2:0','4:0',NULL)
insert into Horaire values (2,'8:0','1:0',NULL)
insert into Horaire values (3,'1:0','6:0',NULL)
insert into Horaire values (4,'9:0','10:0',NULL)

insert into Séance values (1,'Alhillal',1,1,100)
insert into Séance values (1,'Arif',2,2,150)
insert into Séance values (2,'Alhillal',2,2,80)
insert into Séance values (2,'MegaRama',1,2,200)
insert into Séance values (3,'MegaRama',2,2,600)
insert into Séance values (3,'Alhillal',3,1,100)
insert into Séance values (1,'Mabrouka',3,3,250)
select * from Acteur,Séance,Horaire,Salle,Cinéma
insert into Acteur values (12,'hillal',7,'03/11/2010')
insert into Acteur values (2,'shari','anas','15/10/1989')
insert into Acteur values (3,'Zaid','badir','2/2/1991')
insert into Acteur values (4,'Dahamne','brahim','1/6/1198')

delete from Acteur where idActeur=1
/* 3) Triggers  */
-- a
create trigger a on Cinéma after delete
As
begin
print 'Imposible de supprimer'
rollback
end
-- b
create  trigger bb on Acteur after insert
As
begin
declare @nom varchar(255),@prenom varchar(255),@id int
Select @nom = (select nom from inserted), @prenom = (select prénom from inserted)
select @id = (select idActeur from inserted)
update Acteur set nom = upper(@nom), prénom = upper(left(@prenom,1))+lower(right(@prenom,len(@prenom-1))) where  idActeur= @id
commit
end
-- cdelete f
delete from Cinéma where
create trigger c on Cinéma after delete
As
begin
declare @nomCinéma varchar(255)
set @nomCinéma = (select nomCinéma from deleted)
delete from Salle  where nomCinéma = @nomCinéma
delete from Séance where nomCinéma = @nomCinéma
commit
end

-- d
create trigger d on Horaire  after insert, update
As
begin
declare @heureDébut time, @heureFin time, @Durée float,@idHoraire int
set @heureDébut = (select heureDébut from inserted)
set @heureFin = (select heureFin from inserted)
set @idHoraire = (select idHoraire from inserted)
update Horaire set Durée = (datediff(second,@heureDébut,@heureFin))/3600 where  idHoraire = @idHoraire
commit
end
-- e
create trigger ee on Séance after insert, update
As
begin
if (select tarif from inserted) > 1000
begin
print 'Le Tarif ne doit pas dépasser 1000 DH.'
rollback
end
end

/* Procédures :  */

--a
alter proc PS_1(@code int, @nbr int output)
As
begin
select @nbr = count(r.idFilm)
from Acteur a, Rôle r
where a.idActeur = @code and r.idActeur = a.idActeur
group by a.idActeur
end
declare @a int
exec PS_1 2, @a output
select @a
--b
create proc PS_2
As
begin
declare c cursor for (select * from Horaire)
declare @idHoraire int, @heureDébut time, @heureFin time,@Durée float, @test int
set @test = 1
declare @t table  (idHoraire int, heureDébut time, heureFin time,Durée float)
open c
fetch next from c into @idHoraire, @heureDébut, @heureFin,@Durée
while @@fetch_status = 0
Begin
if (datediff(second,@heureDébut, @heureFin)) < 0 or ((datediff(second,@heureDébut, @heureFin)) / 3600) > 5
set @test = @idHoraire
fetch next from c into @idHoraire, @heureDébut, @heureFin,@Durée
end
if @test = 0
print 'les conndtion est faux dans lenregistrement est : '+ cast(@idHoraire as varchar)
else
begin
delete  from Horaire
insert into  Horaire select * from @t
end
close c
deallocate c
end
--c
create proc PS_3
As
begin
declare c1 cursor for (select c.ville, COUNT(*),COUNT(s.noSalle) from Cinéma c, Salle  s where c.nomCinéma = s.nomCinéma group by c.ville order by c.ville asc)
declare @v varchar(255), @nbrcénima int, @nbrsalle int
open c1
fetch next from c1 into @v, @nbrcénima, @nbrsalle
while @@FETCH_STATUS = 0
begin
print 'la  ville est : '+ cast(@v as varchar(255))+'Nbr Cénima '+cast(@nbrcénima as varchar(255))+'Nbr Salle '+cast(@nbrsalle as varchar(255))
fetch next from c1 into @v, @nbrcénima, @nbrsalle
end
close c1
deallocate c1
end
-- d
create table Grp_Cin (code int , descriptions varchar(255))
alter proc PS_4
As
begin
declare @i int
set @i =  1
while (@i < 5)
begin
insert into Grp_Cin values (@i,'Groupe'+CAST(@i as varchar))
set @i = @i +1
end
end
exec PS_4
select * from Grp_Cin

--e
alter table Cinéma add CodeG  int
alter proc PS_4
As
begin
declare c2 cursor for (select c.nomCinéma,COUNT(s.noSalle) from Cinéma c, Salle s where c.nomCinéma = s.nomCinéma group by c.nomCinéma)
declare @NomC varchar(255), @compt int
open c2
fetch next from c2 into @NomC,@compt
while @@FETCH_STATUS = 0
begin
if @compt <= 1
update Cinéma set CodeG = 1 where nomCinéma = @NomC
if @compt between 1 and 3
update Cinéma set CodeG = 2 where nomCinéma = @NomC
if @compt between 3 and 5
update Cinéma set CodeG = 3 where nomCinéma = @NomC
if @compt > 5
update Cinéma set CodeG = 4 where nomCinéma = @NomC
fetch next from c2 into @NomC,@compt
end
end

exec PS_4
--f
create table T (
nomCinéma varchar(255),
numéro int,
rue varchar(255),
ville varchar(255),
noSalle int,
capacité int,
climatisée int
)
select * from t
create proc PS_5
As
begin
insert into T select Cinéma.nomCinéma, numéro, rue, ville,noSalle, capacité, climatisée from Cinéma , salle
end
exec PS_5











Formateur




Directeur Pédagogique
Directeur du complexe/Directeur de l'EFP
Visa de La DRTA