SQL Server 226951280.

doc
1)-PROCÉDURES STOCKÉES.
 Une procédure stockée (Stored Procedure pour SQL Server) est une suite
d’instructions SQL stockées dns ! "se de données et pouvnt #tre e$écutée pr
ppe! de son no%.
 &utres ter%es uti!isés ' procédure ct!o(uée ) procédure %é%orisée
*e%ote procedure en n(!is.
 Prticu!rités '
Les procédures stockées di++,rent des instructions SQL '
!eur s-nt$e est véri+iée et e!!es sont co%pi!ées. .’est !e code co%pi!é /ui est
uti!isé !ors des ppe!s
ne sont ps ppe!ées uto%ti/ue%ent0 %is doivent +ire !’o"1et d’un ppe!
e$p!icite de ! prt de !’uti!isteur.
peuvent #tre ppe!ées pr p!usieurs pp!ictions +ront!es
 &vnt(es '
&%é!iorent !es per+or%nces pr uti!istion du code co%pi!é
*en+orcent !’inté(rité de ! "se '
en centr!isnt !es trite%ents en un endroit uni/ue  unicité du code
2)- CRÉATION DES PROCÉDURES STOCKÉES.
L crétion de procédures %é%orisées se +it dns ! "se cournte vec !’instruction
SQL
CREATE PROCedure
S-nt$e '
CREATE PROC nom_de_procédure AS ordre_SQL
(*)
(*)
voir Fiche technique programmation SQL
.ette crétion est +is"!e soit
2 en intercti+ (r3ce 4 ISQL/w
2 u trvers !e (estionnire d’o"1ets de SQL Server ' SQL Entrepr!e "#n#$er
Re%#r&ue'
Les procédures ct!o(uées sont des o"1ets co%pi!és.
.eci i%p!i/ue /u’e!!es ne peuvent ps #tre %odi+iées.
Une procédure stockée doit #tre suppri%ée pour #tre 4 nouveu créée.
.ependnt0 !’inter+ce SQL 5"1ect 6n(er %s/ue cette contrinte.
L suppression d’une procédure %é%orisée se +it pr '
DROP PROCedure nom_de_procédure
777.tsdi.or( P(e 1
SQL Server 226951280.doc
I%#$e de ()nter*#+e SQL O,-e+t "#n#$er
*e%r/ue ' Le "outon vert co%pi!e ! procédure stockée %is ne !8e$écute ps
777.tsdi.or( P(e 2
SQL Server 226951280.doc
E./+ut0n de pr0+/dure! !t0+1/e!.
L’e$écution d’une procédure %é%orisée se +it pr ppe! (r3ce 4 !’instruction SQL
E2ECute
S-nt$e '
E2ECUTE nom_de_procédure
ou
E2EC nom_de_procédure
L’ppe! pour e$écution d’une procédure stockée peut se +ire en intercti+ (vec
!8uti!itire 9s/!) ou #tre inc!us dns un e$écut"!e (r3ce 4 un !n((e :;te (<rnsct
SQL pour SQL Server) ou tout !n((e supportnt !’envoi de re/u#tes SQL te! /ue
=isu! >sic.
C0d#$e d)une pr0+/dure !t0+1/e 3 +*. +4#ptre 1).
?!!e se +it pr !’inter+ce SQL 5"1ect 6n(er.
Le !n((e uti!isé est <rnsct S/! pour S/! Server
?$e%p!e d8une procédure stockée sous SQL Server'
@Liste des éditeurs et uteurs vec cu%u! nnue! des ventes@
i+ e$ists (se!ect A +ro% s-so"1ects 7:ere id B o"1ectCid(8d"o.rept/28) nd s-sstt D 0$+ B E)
drop procedure d"o.rept/2
F5
.*?&<? P*5.?GU*? rept/2 &S
S?L?.< t-pe0 idCéditeur0 titres.idCtitre0 c%dCuteur0
H%e B su"strin( (no%Cuteur0 1015)0 cu%u!nnue!Cventes
I*56 titres0 uteurs0 titreuteur
JK?*? titres.idCtitre B titreuteur.idCtitre &HG uteurs.idCuteur B titreuteur.idCuteur
&HG idCéditeur is H5< HULL
5*G?* >L idCéditeur0 t-pe
.56PU<? v((cu%u!nnue!Cventes) >L idCéditeur0 t-pe
.56PU<? v((cu%u!nnue!Cventes) >L idCéditeur
F5
*e%r/ue ' ! prtie :ute de ! procédure ct!o(uée 0suppression de ce!!e2ci
vnt recrétion0 est (énérée uto%ti/ue%ent pr S/! Server.
777.tsdi.or( P(e M
SQL Server 226951280.doc
M)2?H=59 G’UH? P*5.NGU*? .&<&L5FUN? SQL S?*=?* &=?. P&SS&F? G? P&*&6O<*?S.
>ut ' Fénér!istion ! notion de c!ient)serveur
.o%%e vu u c:pitre 10 ! +cu!té de créer et de conserver des trite%ents dns
!e no-u %#%e du SF>G* sous +or%e de procédures ct!o(uées (ou procédures
stockées ou de procédures %é%orisées) et de !es ppe!er dns !es trite%ents
ssociés u c!ient ccroPt !es possi"i!ités de trite%ents et surtout ! soup!esse des
pp!ictions +ront!es (code co:érent et uni/ue) et !eur +i"i!ité en %intennce (une
seu!e source de code 4 %intenir en cs de "esoin de %odi+iction).
.ependnt si !’on s’en tient u c:pitre 10 i! est possi"!e de de%nder !e
déc!enc:e%ent de procédures stockées %ono!it:i/ues et +i(ées.
L’intér#t serit de pouvoir dé+inir u niveu du SF>G* des pr0+/dure! $/n/r&ue!
/ui ccepterient en entrée !ors de !eur e$écution une ou des v!eurs prticu!i,res /ui
per%ettrit d’++iner !e trite%ent %ono!it:i/ue et de !e rendre Q #d#pt#,(e R.
?$e%p!e'
& supposer /ue !’on trvi!!e sur une "se de données d’un c!u" de vcnces et
/ue !’on it "esoin de connPtre !es ctivités d’un vi!!(e donné dns une
pp!iction +ront!e.
9! est évident /u’en +onction de ! de%nde0 i! ne s’(ir ps tou1ours du %#%e
vi!!(e. Gns ces conditions0 !’intér#t serit de pouvoir dé+inir u niveu "se de
données une procédure dont ! +onctionn!ité serit de retrouver !es ctivités
propres 4 un vi!!(e donné /ue!con/ue0 4 c:r(e pour ! personne ou !e
trite%ent ppe!nt cette +onction de !ui +ournir pour /ue! vi!!(e !es in+or%tions
sont de%ndées.
L procédure pourrit !ors e++ectuer s rec:erc:e et renvo-er !es ctivités
correspondnt u vi!!(e en /uestion sous +or%e t"u!ire. Les trite%ents
de%ndeurs en +ront! prennt !e re!is pour présenter ces in+or%tions.
"!e en 0eu5re.
Gns !e cdre de trvi! (=isu! >sic en tnt /ue +ront! et SQL Server en serveur de
"se de données)0 on sit e++ective%ent déc!enc:er une procédure stockée vi 5G>..
*este 4 svoir'
 si SQL Server d%et !e pss(e de v!eurs dns ses procédures.
 co%%ent psser ces v!eurs de =isu! >sic vers SQL Server et vec /ue!!e
s-nt$e.
1
er
p0nt ' (e! pr0+/dure! +#t#(0$u/e! de SQL Ser5er #++eptent-e((e! de! 5#(eur!6
*éponse ' oui0 c’est dé14 S4T
.o%%entU
777.tsdi.or( P(e E
SQL Server 226951280.doc

?n +it0 dns !es procédures nécessitnt des v!eurs prticu!i,res i! v #tre
nécessire de dé+inir co%"ien de v!eurs seront pssées !ors de !’ppe! et
sous /ue!!e +or%e.
5n pr!e de p#r#%7tre! et de pr0+/dure! p#r#%7tr#,(e!.
.e!!es2ci respectent certines r,(!es de s-nt$e u %o%ent '
 de ! crétion de ! procédure
 de son uti!istion.
Cr/#t0n d)une pr0+/dure !t0+1/e p#r#%7tr#,(e.
?!!e se +it pr !’inter+ce SQL 5"1ect 6n(er.
L s-nt$e est ce!!e donnée dns !’e$e%p!e ci2dessous.
.E.e%p(e de d/+(#r#t0n d)une pr0+/dure +#t#(0$u/e d#n! SQL Ser5er
#5e+ p#r#%7tre! en entr/e
i+ e$ists (se!ect A +ro% s-so"1ects 7:ere id B o"1ectCid(8d"o.rept/M8) nd s-sstt D 0$+ B E)
drop procedure d"o.rept/M
F5
.*?&<? P*5.?GU*? rept/M
V!i%iteCin+érieure %one-0
V!i%iteCsupérieure %one-0
Vt-pe c:r(12)
&S
S?L?.< idCéditeur0 t-pe0 idCtitre0 pri$
I*56 titres
JK?*? pri$ WV!i%iteCin+érieure &HG pri$ XV!i%iteCsupérieure &HG t-pe B Vt-pe 5* t-pe L9Y? 8Zcui
Z8
5*G?* >L idCéditeur0 t-pe
.56PU<? count(idCtitre) >L idCéditeur0 t-pe
F5
9nterpréttions'
L procédure stockée rp+8 rept/M déc!re voir "esoin de trois pr%,tres en
entrée '
- 9t:pe une c:Pne de 12 crct,res
- 9(%te8n*/reure %one-
- 9(%te8n*/reure %one-
.es <rois pr%,tres pssés seront uti!isés dns ! c!use de restriction where de
!’ordre Se!ect de te!!e %ni,re /ue !’on ne sou:ite voir en résu!tt de Se!ect (+or%e
t"u!ire) /ue !es !i(nes correspondnt 4 ! de%nde
Re%#r&ue'
! s-nt$e pour c:/ue pr%,tre est @nom_symboique ussi "ien en
déc!rtion /u’en %nipu!tion
777.tsdi.or( P(e 5
SQL Server 226951280.doc
.E.e%p(e de d/+(#r#t0n d)une pr0+/dure +#t#(0$u/e d#n! SQL Ser5er #5e+
p#r#%7tre! en entr/e et p#r#%7tre! en !0rte
.ertines procédures peuvent retourner une (ou p!usieurs) v!eurs (s).
Gns ce cs0 préciser 5U<PU< pr,s !e no% et !e t-pe du pr%,tre.
?$e%p!e ' Vpr%1 int 5U<PU<
.*?&<? P*5.?GU*? rept/M2
V%$nu% int 5U<PU<
&S
>e(in
9+ e$ists(se!ect A +ro% e%p!o-es)
>e(in
Se!ect V%$nu% B (se!ect %$(nu%e%p) +ro% e%p!o-es)
?nd
?!se
>e(in
Se!ect V%$nu% B 0
?nd
end
F5
L procédure stockée rept/M2 renvoie une v!eur de retour /ui est !e p!us (rnd
nu%éro d’e%p!o-é de ! t"!e e%p!o-és (ou 0) si ! t"!e est vide.
777.tsdi.or( P(e 6
SQL Server 226951280.doc
Cr/#t0n d)une pr0+/dure !t0+1/e ,#(#:#nt (e r/!u(t#t d)une re&u;te
L’uti!istion des curseurs est une tec:ni/ue per%ettnt de triter !i(ne pr !i(ne !e
résu!tt d’une re/u#te.
Le curseur doit #tre déc!ré '
De+(#re c1 cursor +or se!ect [[[[..
Puis ouvert '
Open c1
Pour e$trire une !i(ne 0 uti!iser !’instruction <et+4 .
?n +in de trite%ent0 +in de !i"érer ! %é%oire0 +er%er !e curseur ' +(0!e c1
puis !e suppri%er ' de#((0+#te c1
e$e%p!e '
on veut stocker dns une t"!e de trvi! !es trois e%p!o-és -nt !e p!us :ut s!ire
et ce pr service.
.*?&<? P*5.?GU*? rept/MM
&S
>e(in
.rete t"!e \te%poCe%p (nu%e%p c:r(6)0 service c:r(2)0 s!ire int)
F5
Gec!re curseur2e%p!o-es cursor +or
se!ect nu%e%p0 service0 s!ire +ro% e%p!o-es order "- service0 s!ire G?S.
dec!re V cpt int
dec!re Vvnu%ero c:r(6)
dec!re Vvservice c:r(2)
dec!re Vv7service c:r(2)
dec!re Vvs!ire int
5pen curseur2e%p!o-es
Ietc: curseur2e%p!o-es into Vvnu%ero0 Vvservice0 Vvs!ire
J:i!e (VV+etc:Csttus B 0)
>e(in
9nsert into te%poCe%p v!ues (Vvnu%ero0 Vvservice0 Vvs!ire)
Se!ect Vv7service B Vvservice
Se!ect cpt B 1
Ietc: curseur2e%p!o-es into vnu%ero0 Vvservice0 Vvs!ire
J:i!e (VV+etc:Csttus B 0 n+ Vvservice B Vv7service)
>e(in
9+ (Vcpt XM)
>e(in
9nsert into te%poCe%p v!ues (Vvnu%ero0 Vvservice0 Vvs!ire)
Se!ect Vcpt B Vcpt ] 1
?nd
Ietc: curseur2e%p!o-es into Vvnu%ero0 Vvservice0 Vvs!ire
end
end
c!ose curseur2e%p!o-es
777.tsdi.or( P(e ^
SQL Server 226951280.doc
de!!octe curseur2e%p!o-es
end
F5
777.tsdi.or( P(e 8
SQL Server 226951280.doc
E)2Uti!istion d’une procédure stockée sous SQL Server.
777.tsdi.or( P(e 9
SQL Server 226951280.doc
777.tsdi.or( P(e 10
SQL Server 226951280.doc
9nterpréttion'
& titre d’e$e%p!e0 !es v!eurs ont été pssées ici sous +or%e de !ittéru$. Le %n/ue
de soup!esse est encore évident et !e "ut de ! %noeuvre consisterit 4 pouvoir
c/uérir !es in+or%tions dont on "esoin (r3ce 4 un di!o(ue pp!iction)uti!isteur_
pour déc!enc:er ensuite ! procédure stockée vec ! ou !es v!eurs c/uises.
.’est ce /ue vont per%ettre =isu! >sic et 5G>.. Suite dns ! proc:ine
sé/uence.
777.tsdi.or( P(e 11
SQL Server 226951280.doc
E)2?$ercices
*eprendre !e c:ier des c:r(es F5?L&HG et triter !es de%ndes suivntes en
procédures stockées '
Pr0+/dure 1 '
5n sou:ite o"tenir pr %od,!e ! %o-enne des :eures de vo! des vions.
Pr0+/dure 2 '
5n sou:ite o"tenir pour une dte donnée ! !iste des réservtions pr !i(ne0 vo! et
étpe0 psser ! dte en pr%,tre.
Gistin(uer ! c!sse touriste de ! 1ere c!sse _ préciser !e no%"re de personnes .
Pr0+/dure = '
5n veut créer une /u!i+iction pour un pi!ote sur un %od,!e d8vion.
- =éri+ier /ue !8e%p!o-é est un pi!ote (<-pe personne! B @P@)
- =éri+ier /u8i! !e dip!;%e re/uis pour ce %od,!e
- =éri+ier ! dte de v!idité du dip!;%e
- Positionner ! dte de /u!i+iction 4 ! dte du 1our
?ntrer !e nu%éro d8e%p!o-é et !e nu%éro de %od,!e.
Pr0+/dure > '
5n veut ++ecter un t-pe de personne! 4 un vo!
- =éri+ier /ue cette personne est "ien ctive (code ctivité B 8&8)
- =éri+ier /ue cette personne n8est ps ++ectée 4 un utre vo! sur !es %#%es
dtes
- =éri+ier /ue ! dte du vo! pour cette ++ecttion est é(!e 4 dte de derni,re
++ecttion p!us 2 1ours.
- =éri+ier /u8i! n8- ps pour '
- Les pi!otes ' p!us de deu$ dé14 ++ectés
- Les :otesses ' p!us de trois dé14 ++ectées
- Les ste7rds ' p!us de 1 dé14 ++ecté
- *envo-er ! !iste des personne!s ++ecté 4 ce vo! pr,s cette ++ecttion
?ntrer !e nu%éro d8e%p!o-é et !e nu%éro de vo!.
777.tsdi.or( P(e 12
SQL Server 226951280.doc
5)2<rite%ent des trnsctions
Qu8est2ce /u8une trnsction et pour/uoi en i21e "esoin U
 .8est une unité de trvi! !o(i/ue
 6odi+iction de ! "se de données en (roupe
 &ssure ! co:érence de ! "se de données
.e sont !es propriétés &.9G
 &to%icité ' succ,s ou éc:ec
 .onsistnce ' tout est +it ou rien n8est +it
 9so!tion ' indépendnt d8utres trnsctions ou événe%ents
 Gur"i!ité ' !es c:n(e%ents0 une +ois trités0 ne peuvent ps #tre
nnu!és
.8est une t3c:e du pro(r%%eur de !8pp!iction ou de ! "se de données de
dé+inir une trnsction vec SQLServer
Les trnsctions peuvent #tre uti!isées dns !e !n((e (rp:i/ue insi /ue dns
<rnsc2SQL (Procédure stockée) '
Gns <SQL0 i! n8- ur ps d8!!er2retour vers !e c!ient0 ! trnsction ser
donc ter%inée p!us rpide%ent.
Gns !e !n((e (rp:i/ue !8uti!istion des trnsctions dépend du
deve!oppe%ent0 écriture du code nécessire u$ trnsctions.
9nstructions <rnsct SQL de (estion d8une trnsction
S-nt$es
Gé"ut de trnsction
>?F9H <*&H`S&.<95Ha `no%trnsctiona
=!idtion de trnsction
.5669< <*&H`S&.<95Ha `no%trnsctiona
Géc!rtion d8un point de contr;!e
S&=? <*&H`S&.<95Ha `no% du point de contr;!ea
&nnu!tion de trnsction
*5LL>&.Y <*&H`S&.<95Ha `no%trnsction)no% de point de contr;!ea
?$e%p!e de trnsction Serveur
777.tsdi.or( P(e 1M
SQL Server 226951280.doc
Libération des personnes a!!ectées " un pro#et " a !in de ceui$ci%
.*?&<? P*5. Pro1ect.o%p!eted (Vpid HU6?*9. (10))
s
>?F9H <*&HS&.<95H &u(%ente
UPG&<? Pro1ect
S?< .o%p!etionGte B (etdte()
JK?*? Pro1ect9G B Vpid
9+ VVro7count B 0
>?F9H
*5LL>&.Y <*&HS&.<95H
*&9S?**5* (89d Pro1ect incorrect 80 160 1)
*?<U*H
?HG
UPG&<? &ssi(n%ent
S?< *e!eseGte B (etdte()
JK?*? Pro1ect9G B Vpid
&HG *e!eseGte is HULL
.5669< <*&HS&.<95H
777.tsdi.or( P(e 1E
SQL Server 226951280.doc
<rnsctions i%"ri/uées
Le *o!!"ck des trnsctions i%"ri/uées renvoie tou1ours u dé"ut de ! pre%i,re
procédure /ui dé%rre ! pre%i,re trnsction.
777.tsdi.or( P(e 15

Begin Tran

CALL B
If not ok
Rollback
Tran
Else
Commit Tran

Begin Tran

CALL C
If not ok
Rollback Tran
Else
Commit Tran

Begin Tran

If not ok
Rollback Tran
Else
Commit Tran
SQL Server 226951280.doc
6)2Festion des verrous
Lors de trnsctions concurrentes0 SQLServer (,re uto%ti/ue%ent
des verrous +in de (rntir ! co:érence des données de c:/ue trnsction.
Une trnsction ne pourr ps %odi+ier des p(es ccessi"!es pr une
utre trnsction0 et ne pourr !ire des p(es en cours de %odi+ictions (!ecture
co:érente).
5n peut (ir sur !es verrous de p!usieurs +Son0 u niveu de !
con+i(urtion et u niveu des trnsctions.
 Les opértions Se!ect ont "esoin d8un verrou prt(é (s:re !ock)
 9nsert0 updte et de!ete nécessitent des verrous e$c!usi+s
.:oi$ du niveu
 Hiveu de ! p(e (P(e !eve!)
 Ges p(es de 2Y (200E8 octets)0 c8est "eucoup pour des t"!es
étroites
 Le niveu de ! p(e %oins de surcobt (te%ps %c:ine) /ue !e
niveu !i(ne.
 Hiveu de ! t"!e (<"!e !eve!)
 &pr,s !e dépsse%ent d8un seui!0 !e verroui!!(e psse u niveu
de t"!e
 .eci réduit !e surcobt db 4 ! (estion du verroui!!(e de p(es
individue!!es
 Hiveu de !8insertion des !i(nes (9nsert *o7 !eve!)
 *éduit ! contention /und !es insertions 1outent des !i(nes 4 !
t"!e
.8est c:oi$ sont +it u niveu (énér! est pprtiennent u respons"!e
de ! "se de données0 !e déve!oppeur indi/ue ce /u8i! +it dns ses
pp!ictions.
777.tsdi.or( P(e 16