Avantaje SQL, ODBC, Delphi
1 Avantaje oferite de SQL
In mod curent exista doua metode uzuale de
utilizare a SQL intr-un program aplicativ:
Embedded SQL
Call level interface for SQL
Standardul ANSI defineste trei
tipuri de realizare a interfetei cu SQL intr-un program de aplicatie:
Module Language
Embedded SQL
Direction Invocation
Dupa cum am spus, SQL
dezvolta si respecta conceptele exprimate de dr. Cood in
definirea modelului relational.Voi enumera in continuare ceea ce este cunoscut
sub numele de cele ,,12 reguli ale lui Cood "(care sunt de fapt 13):
Un sistem de
administrare a bazelor de date trebuie sa poata administra bazele de
date in intregime prin functiile sale relationale.
Toate
informatiile dintr-o baza de date (inclusiv numele de tabel si
de coloana ) sunt reprezentate explicit ca valori in tabele.
Orice valoare
dintr-o baza de date este accesibila prin folosirea unei combinatii intre numele tabelului,
valoarea cheii primare si numele coloanei.
SGBD-ul
ofera un suport sistematic pentru tratamentul valorilor nule, diferit de
valorile prestabilite si independent de orice domeniu.
Trebuie
sa existe cel putin un limbaj acceptat care sa aiba o
sintaxa bine definita si sa fie multilateral, prin faptul
ca suporta definirea si manipularea datelor,regulile de
integritate,autorizarea si tranzactiile.
Descrierea
bazei de date si a componentelor sale este reprezentata la nivel
logic sub forma de tabele si de aceea poate fi interogata
folosind limbajul bazei de date
Toate vederile
care pot fi actualizate pot fi actualizate in cadrul sistemului.
SGBD-ul
suporta nu numai regasirea datelor ci si inserari,
stergeri si actualizari.
Programele de
aplicatii si cele create pe moment nu sunt afectate din punct de vedere logic la deteriorarea metodelor de
acces fizic sau a structurilor de memorare.
Programele de
aplicatii si cele create pe moment nu sunt afectate din punct de
vedere logic cand sunt facute modificari in structura tabelelor.
Limbajul bazei
de date trebuie sa poata defini reguli de integritate.
Programele de
aplicatii si cererile momentane nu sunt afetate din punct de vedere
logic la prima distribuire a datelor sau la o distribuire ulterioara.
Nu trebuie
sa fie posibil sa fie incalcate regulile de integritate definite
prin limbajul bazei de date prin folosirea limbajelor de nivel inferior.
Toate aceste reguli sunt respectate de catre SQL.
Noul standard SQL3 preconizeaza o serie de extensii
fata de standardul actual SQL2 in conditiile mentinerii
compatibilitatii totale cu acesta:
Facilitati
orientate obiect se refera la : posibilitatea de definire la nivel
utilizator a tipurilor de date abstracte, incluzand metode, identitatea
obiectelor, subtipuri si mostenire, polimorfism, etc;
Structuri de
control specifice limbajelor complet computationale:IF, FOR, WHILE, etc
ceea ce va transforma SQL intr-un limbaj de sine statator a
carui putere e expresie nu este limitata la nivelul limbajelor
relationale;
Facilitati
pentru exprimarea prelucrarilor cu caracter recursiv;
Facilitati
pentru lucrul in retea;
Facilitati
pentru prelucrare distribuita,inclusiv pentru tehnologia
client/server.Aceasta presupune mecanisme pentru crearea, memorarea si
executia procedurilor la nivelul server-elor de date(stored procedure);
Facilitati
multi-media care sunt inglobate in modulul specializat Multi-Media SQL
Facilitati
pentru tratarea timpului in bazele de date, facilitati care fac parte
din componenta Temporal SQL;
Ma voi referii intai la mediul Microsoft SQL 7.0 ca
avantaje oferite din punctul de vedere al SGBD-ului.Pentru acest lucru voi
explicita ce anume trebuie urmarit cand se face evaluarea unui produs ce
gestioneaza date.
O notiune importanta este cea de tranzactie.O tranzactie
este o unitate logica de prelucrare care asigura consistenta si
siguranta bazei de date.In principiu orice executie a unui program se
poate considera o tranzactie daca baza de date este intr-o stare
consistenta atat inainte cat si dupa executia sa.
Acest lucru trebuie indeplinit indiferent daca:
-tranzactia a fost executata in mod concurent cu alte tranzactii;
-au aparut defecte in timpul executiei;
In general,o tranzactie consta dintr-o secventa de
operatii de citire si scriere a bazei de date , la care se
adauga o serie de operatii de calcul.Baza de date poate fi intr-o
stare temporar inconsistenta in timpul executarii tranzactiei, dar
trebuie sa fie in stari consistente atat inainte cat si
dupa executia tranzactiei.
Dupa cum am mentionat
mai inainte, apar doua puncte de vedere din a caror unghi trebuie sa
privim probleme: controlul concurentei si rezistenta la defecte.
Prima problema cea de
control al concurentei se ocupa de mecanismele de sincronizare a
acceselor astfel incat sa fie mentinuta integritatea bazei de
date.Automat cand discutam despre controlul concurentei cu mecanisme de blocare apare o problema
colaterala : cea a interblocarilor.
Cea de-a doua
problema a rezistentei la defecte se refera la tehnicile prin
care se asigura atat toleranta sistemului fata de defectele
aparute, cat si la capacitatea de recuperare a acestuia, adica
posibilitatea de revenire la o stare consistenta in urma aparitiei
unui defect care a cauzat intrarea lui intr-o stare incostintenta. Asupra
acestor probleme voi revenii mai incolo cu o detaliere mai profunda a problemei.
Pentru a
raspunde cerintelor o tranzactie trebuie sa
indeplineasca ceea ce in literatura este cunoscut sub acronimul de
ACID.In continuare voi explicita importanta fiecarei proprietati
si cum raspunde SQL-ul la indeplinirea lor.
a)ATOMICITATEA se refera la faptul
ca o tranzactie este considerata o unitate elementara de
prelucrare ceea ce inseamna ca tranzactiile se executa
dupa regula ,, totul sau nimic", adica ori se executa toate
operatiile din tranzactie ori nu se executa nimic. Dupa cum
am spus o tranzactie este reprezentata de o operatie de scriere
sau citire intercalate cu diferite operatii aplicate asupra datelor ce
constituie obiectul tranzactiei.SGBD-ul ,in cazul intreruperii bruste
si neprevazute a programului, are doua posibilitati: fie
completeaza operatiile ramase neexecutate din cadrul
tranzactiei ,terminand tranzactia cu succes fie anuleaza toate
efectele executate de tranzactie.In cazul SQL-ului, o tranzactie
poate fii reprezentata de-o operatie de selectare a unui set de date
sau de o aceeasi operatie de selectare urmata si de-o
prelucrare a datelor.Pentru a se privii o serie de operatii separate ca un
tot unitar , SQL-ul ofera posibilitatea definirii corpului unei
tranzactii intre ,,BEGIN TRANSACTION" si ,,END TRANSACTION" ceea ce
va provoca SGBD-ul sa priveasca totul ca un tot unitar si deci
intreruperea accidentala a programului va duce la eliminarea corecta
a efectelor programului.Daca sistemul cade in timpul efectuarii unei
operatii elementare inainte de validarea ei rezultatele ei vor fii
anulate.
b)CONSISTENTA unei tranzactii
consta pur si simplu in corectitudinea sa.Orice tranzactie,
daca este executata independent, trebuie sa mentina
consistenta bazei de date.Altfel spus, o tranzactie este un program
corect care transforma o baza dintr-o stare consistenta intr-o
alta stare consistenta.Prin consistenta bazei de date
intelegem satisfacerea tuturor constrangerilor de integritate, explicite
sau implicite, cum ar fi: unicitatea cheilor primare, integritatea
referentiala, orice predicat exprimat in sens de constrangere de
integritate asupra bazei de date.Sql-ul executa verificare de unicitate a
cheii primare la fiecare introducere a unei tuple sau la modificarea unor
tuple.In ce priveste integritatea referentiala, exista o
posibilitate de verificare a integritatii referentiale prin
utilizarea ,,DATABASE DIAGRAMS'' ceea ce permite SQL-ului sa verifice
si sa nu se permita violarea integritatii.Dar fiecare
moneda are reversul ei, folosirea ,,DATABASE DIAGRAM'' impunand anumite
restrictii la stergerea si adaugarea unor noi tuple, deci o
alta abordare a acestor probleme.Se poate renunta la acest lucru in
schimbul preluarii acestui job de catre programator.De fapt
aceasta proprietate este in mare parte asigurata de catre
programatorul aplicatiei.Dar de remarcat faptul ca prin utilizarea
unor facilitati oferite de SQL se minimizeaza rolul
proiectantului.
Trebuie specificat faptul ca starile
intermediare prin care trece baza de date in timpul executiei unei
tranzactii nu sunt neaparat consistente.
c)IZOLAREA se refera la proprietatea oricarei
tranzactii de-a avea acces doar la starile consistente ale bazei de
date.Aceasta inseamna ca modificarile efectuate de catre o
tranzactie sunt inaccesibile altor tranzactii concurente pana in
momentul validarii acesteia.Prin proprietatea de izolare se creaza
iluzia ca fiecare tranzactie este executata singura in
sistem .Izolarea tranzactiilor este asigurata de algoritmii de
control ai cocurentei.Proprietatea de izolare este importanta deoarece
elimina fenomenul de ,,abortare in cascada" al
tranzactiilor.Intr-adevar daca rezultatele incomplete ale unui
tranzactii ar fi vizibile altor tranzactii inainte de validarea
acesteia sidaca se intampla ca aceasta sa aborteze, atunci
toate tranzactiile care au accesat rezultatele incomplete vor trebui abortate.Aceasta ar duce la abortare altor
tranzactii s,a.m.d. rezultand efectul domino.
d)DURABILITATEA este proprietatea prin
care se garanteaza faptul ca odata tranzactia validata
, rezultatele sale devin permanente.SQL dispune de un jurnal cu care chiar
daca dupa momentul validarii apare un defect, care
impiedica inscrierea normala a rezultatelor in baza de date, acestea
vor fi trecute in baza de date la reluarea activitatii.
Dupa
cum am mai mentionat, aplicatia este una de tip client-server.Acest
lucru implica automat aparitia
unor situatii de conflict datorate accesului concurent la bazele de date
prin accesarea simultana.Modul de rezolvare a conflictului depinde de
natura cererilor de acces la date, functie de care distingem doua
cazuri:
Cereri de
acces de tip ,,regasire", atunci secventializarea accesului la mediul
de memorare este suficienta pentru a nu mai fi nevoi de alte
precautii.Rezolvarea situatiilor conflictuale cauzate de
operatii de citire simultane poate
fi lasate in seama sistemului de operarecare stabileste ordinea de
satisfacere a cererilor dupa criteriul asigurarii concurentei
maxime de operare minimizand timpul gobal de satisfacere a cererilor.
Cereri de
acces de tip ,,actualizare''.In aceste cazuri este necesara aplicarea unor
strategii adecvate de tratare a cererilor de acces.
Calea cea mai simpla de evitare a interactiunilor este de a executa
tranzactiile in mod independent una de alta.Este clar ca o asemenea
alternativa prezinta interes doar din punct de vedere teoretic
si din punct de vedere practic este inacceptabila deoarece reduce la
minim nivelul concurentei.In fapt nivelul de concurenta
(numarul de tranzactii executate concurent ) este un factor deosebit
de important al unui programator.De accea trebuie facut un compromis intre
mentinerea consistentei bazei de date si obtinerea unui
nivel de concurenta cat mai ridicat.
SQL pune la dispozitie mai multe instrumente de control al
concurentei:
Una ar fi
posibilitatea de setare a nivelului de izolare a tranzactiei. SET TRANSACTION
ISOLATION LEVEL este o comanda care permite accest lucru.Setarea se face
in functie de nevoile tranzactiei care este setata.Avem 4 tipuri
de setari: READ COMMITTED, READ UNCOMMITTED, REPEATABLE READ, SERIALIZABLE
La READ COMMITTED datele sunt blocate
pana cand datele au inceput sa fie citite eliminandu-se ceea ce se
cunoaste sub numele de dirty reads, dar datele pot fi modificate inainte
de terminarea tranzactiei ceea ce duce la aparitia fenomenului de
date fantoma(phantom data).Este optiunea default a SQL serverului.
La
READ UNCOMMITTED favorizeaza dirty reads si blocaje de gradul 0.Cand
aceasta optiune este setata se favorizeaza citirea inainte
de validare si citirea de dirty date;datele se vor schimba inainte de
terminarea tranzactiei si tuple vor aparea si disparea in
timpul executiei unei tranzactii.Este echivalenta cu utilizarea
lui NONLOCK.Este cea mai putin restrictiva directiva dintre cele 4.
La REPEATABLE READ sunt blocate toate
inregistrarile care sunt selectate in query,nepermitand utilizatorilor
sa modifice datele blocate,dar nu sunt impie-dicate introducerea de noi
randuri de catre un alt utilizator in setul de date care vor afecta
citirile ulterioare din cadrul tranzactiei.Avand cel mai scazut grad
de concurentialitate, se recomanda utilizarea lui doar cand este
necesar.
La SERIALIZABLE se blocheaza tot
setul de date.Este cea mai restrictiva de aceea are nivelul de
concurenta cel mai scazut.
Daca
nu se doreste utilizarea acestor setari care actioneaza pe
durata setarii, se poate jongla la
select sau in tranzactii mai explicit prin utilizare unitatii de
acces a SQL-ului.Aceasta unitate de acces (items) reprezinta o
portiune a bazei de date care poate constitui obiectul unei operatii
de blocare(lock).Prin blocarea unei unitati de acces o
tranzactie poate impiedica accesul altor tranzactii la unitatea
blocata pana in momen-tul deblocarii acestei unitati
de catre tranzactia care a efectuat blocarea.Gestiunea
operatiilor de blocare, precum si arbitrarea cererilor de blocare
venite din partea tranzactiilor este realizata de catre o
componenta speciala :lock manager.Natura si dimensiunea
unitatilor de acces este stabilita de proiectantul
sistemului.Exista si o unitate de acces minima care in cazul SQL 7.0
este de o inregistrare ceea ce sporeste considerabil nivelul
concurentei.Prin utilizarea unor unitati mari de acces se
dimensiuni mari se reduce numarul de operatii de blocare ceea ce
inseamna reduce-rea excesului de timp consumat de sistem pentru gestionarea
acestor operatii, precum si reducerea spatiului de memorie
necesar inregistrarii blocajelor.In schimb utilizarea unei
unitati de acces de dimensiuni mici creste considerabil gradul de concurenta. SQL-ul permite
utilizarea unor comenzi ca nolock,lockall,etc.
Avand in vedere ca limbajul SQL constituie partea cea mai
importanta a lucrarii,in continuare voi face o scurta prezentare
a limbajului SQL si a principalelor moduri de lucru cu el.
Operatia
fundamentala in SQL este maparea, reprezentata din punc de vedere
sintactic printr-o constructie SELECT-FROM-WHERE(pe scurt constructie
SELECT). Aceasta constructie corespunde unei succesiuni de operatori
algebrici de forma selectie-proiectie-cuplare foarte frecventa in algebra
relationala.
Clauza
SELECT realizeaza operatia de proiectie si este urmata
de lista de atribute care se retin in relatia rezultat.Ea nu trebuie
confundata cu selectia din algebra relationala asa cum
am fi tentati in mod eronat asa cum am fi tentati in mod eronat
ca urmare a asemanarii intre denumiri.De remarcat ca
proiectia SQL difera de operatorul de proiectie definit in
cadrul algebrei relationale prin faptul ca nu elimina in mod
automat tuplelel duplicat.Eliminarea tuplelor duplicat, atunci cand este
necesara ,trebuie solicitata in mod explicit de catre utlizator
prin folosirea operatorului DISTINCT.In SQL s-a adoptat aceasta strategie
din motive de eficienta, operatia de eliminare a duplicatelor
fiind relativ costisitoare.
Operatia
de cuplare poate fi realizata cu ajutorul clauzei FROM, atunci cand
ea este urmata de o lista formata din cel putin doua
nume de relatie,impreuna cu conditia de cuplare formulata
in cadrul clauzei WHERE.
Selectia
este realizata prin cea de-a treia clauza, WHERE , care de cale mai
multe ori este urmata de un predicat (calificator) referitor la atributele
relatilor din clauza FROM.Clauza WHERE este insa mult mai
complexa decat operatia de
selectie din algebra relationala, deoarece expresia care o
urmeaza poate contine atat comparatii de atribute si/sau expresii aritmetice, cat si
operatori logici(AND, OR, NOT), operatori pe pe multimi(UNION, INTERSECT,
MINUS) si operatori de
apartenenta la multimi cu negarile acestora(X IN S, X NOT
IN S,S CONTAINS X,S DOES NOT CONTAINS X, unde S este o relatie si X
este o tulpa sau o relatie caz in care este vorba de operatii de
incluziune intre multimi).Expresia care urmeaza clauzei WHERE pote de
asemeni sa contina operanzi care sunt relatii rezultate din
alte constructii SELECT ceea ce asigura posibilitatea imbricarii
acestora in interogari oricat de complexe.
Facilitatile
limbajului SQL provenite din calculul relational al tuplelor se
refera in principal la posibilitatea de a declara variabile de tupla
asociate unor relatii. Asocierea se face in cadrul clauzei FROM sub forma:
SELECT .FROM R T WHERE . unde R
este o relatie, iar T este o variabila de tupla.
Variabila
de tupla T poate fi folosita in cadrul expresiei care urmeaza
dupa clauza WHERE, unde se pot face referiri la valoarea componentei A din tulpa T prin notatia T.A.
Sintaxa
completa a constructiei SELECT este urmatoarea :
SELECT [DISTINCT] nume_atribut1.
FROM nume_relatie[variabila_de_tupla].
[WHERE calificator1]
[GROUP BY nume_atribut 2.
[HAVING calificator2]]
[ORDER BY
nume_atribut3[ASC/DESC].]
unde [] desemneaza o componenta
optionala a constructiei, iar. indica repetarea de unul sau
mai multe ori a parametrului clauzei curente(lista de parametri).
Valoarea
(valorile) corespunzatoare parametrului (parametrului) nume_atribut1
precizeaza in mod explicit atributele dupa care se face
proiectia.Daca exista ambiguitati referitor la
relatiile din care fac parte atributele specificate, atunci acestea vor fi
precedate de numele relatiei corespunzatoare fiecarui
atribut.Daca in locul acestei liste se foloseste simbolul * atunci proiectia
se face dupa toate atributele relatiei (relatiilor) specificate
in clauza FROM.In lipsa operatorului optional DISTINCT proiectia se
face fara eliminarea duplicatelor iar daca acesta apare, atunci
se elimina eventualele duplicate rezultate in urma operatiei de
proiectie propriu-zisa.In cazul cel mai general, parametrul
nume_atribut_1 poate fi o expresie aritmetica combinand atribute si
/sau functii de agregare avand ca operanzi unul sau mai multe atribute.
Prin
parametrul nume_relatie se specifica relatia (relatiile )
care constitue operandul (operanzii ) operatorului de mapare prin parametrul
variabila_de_tupla putem asocia fiecarei relatii cate o
variabila de tupla.
Parametrul
calificator1 precizeaza criteriul de selectie al tuplelor unei
relatii.
Clauza
GROUP BY are ca efect grupare tuplelor unei relatii pe baza valorilor unui
atribut sau grup de atribute.Parametrul nume_atribut2, furnizeaza
parametrul de grupare(partitionare ) al tuplelor unei relatii in
submultimi de tuple, toate avand aceeasi valoare pentru
atributul(atributele) nume_atribut2.Criteriul de grupare este format din unul
sau mai multe atribute.Aceste submultimi sau grupuri de tuple urmeaza
a fi tratate ca un tot unitar in anumite operatii cum ar fi aplicare functiilor
de agregare care se calculeaza nu pe intreaga relatie, ci pentru
fiecare grup de tuple in parte.Relatia rezultat al oricarei
interogari care are o clauza GROUP BY caracterizeaza aceste
grupuri de tuple si nu tuple
individuale.Parametrii clauzei SELECT dintr-o constructie SELECT in care
apare clauza GROUP BY trebuie sa reprezinte o proprietate unica de
grup.Prin aceasta intelegem fie un atribut de grupare, fie o functie
de agregare aplicata tuplelor unui grup, fie o expresie formata pe baza primelor doua.
Clauza
HAVING , optiune a clauzei GROUP BY, este o optiune speciala a
clauzei WHERE caracterizata prin faptul ca se aplica nu unor
tuple individuale ci unor submultimi (grupuri) de tuple, rezultate ca
urmare a partitionarii prin clauza GROUP BY.
Parametrul
calificator2 furnizeaza criteriul de selectie al grupurilor de tuple.
Acest parametru se refera intotdeauna la proprietatile globale
ale unui grup de tuple si nu la tuple individuale.Astfel tuplele unui grup
nu sunt tratate impreuna, in bloc, conform criteriului dat de parametrul
calificator2.Exprimarea acestui criteriu se face cu ajutorul atributelor de
grupare si al functiilor de agregare aplicate grupurilor.
Clauza
ORDER BY specifica ordonare tuplelor unei relatii rezultat dupa
nume_atribut3, iar cuvintele cheie ASC/DESC indica modul in care se face
ordonarea, in mod crecator sau descrescator ale atributului
specificat.
Interogarile
care implica mai multe relatii, dar returneaza date dintr-o
singura relatie pot fi rezolvate prin imbricarea a mai multe
constructii SELECT. Datorita posibilitatii de imbricare
datele rezultate dintr-un tabel pot fi folosite la selectia datelor
dintr-un alt tabel. Desi aceasta facilitate este aproape
similara cu operatorul de cuplare, difera totusi de acesta prin
faptul ca din rezultatul final nu pot face parte decat datele
rezultate din ultimul tabel (cel corespunzator blocului celui mai
exterior). Majoritatea implementarilor limbajului SQL, permit imbricarea
pe mai multe nivele, la cele mai performante fiind posibila pana la
16 nivele de imbricare a constructilor SELECT.
Limbajul
SQL nu dispune de cuantificatori, cum apar acestia in calculul
relational de aceea efectul acestora trebuie simulat prin folosirea
relatilor de apartenenta de tipul element-multime , de
incluziune multime-multime sau de egalitate intre multimi.
In
SQL relatia de aprtenenta a unei valori la o multime este
reprezentata prin operatorul IS IN sau IN simplu.La fel se reprezinta
si relatia de incluziune intre multimi.Deci A IN B
semnifica: "A apartine lui B" daca A este o valoare, sau "A este
inclusa in B" daca A este o multime.B trebuie sa fie o
multime in ambele cazuri.Simetricul operatorului IN este operatorul
CONTAINS.A CONTAINS B semnifica : "A contine pe B" unde A este multime
iar B este o valoare sau multime.De asemeni se pot folosi si negarea
acestor acestor operatori, anume NOT IN , DOES NOT CONTAIN.Testare
aegalitatii sau inegalitatii a doua multimi se
face prin operatorii = si # (sau != sau <>).
Un alt instrument puternic de lucru oferit de SQL il reprezinta
posibilitatea definirii de proceduri stocate.Acestea reprezinta in
lucrarea mea principalul mijloc de prelucrare a datelor.Definirea de proceduri
stocate ne permite pelucarea datelor in mod avantajos, realizandu-se
performante deosebite prin faptul ca contin grupuri mari de
instructiuni SQL.Aceste functii sunt apelate si executate ca
si functiile C,Fortran sau VBASIC.O procedura rezidenta
poate incapsula un set logic de comenzi care sunt executate mai des in cadrul
aplicatiei.Acest lucru permite programatorului sa apleze pur si
simplu procedura rezidenta ca pe o functie in locul executarii
repetate a instructiunilor din cadrul acesteia.De asemeni, crearea unei
proceduri stocate, permite programatorului sa apleze un anumit set de
instructiuni din alte programe realizand o anumita operatie
complexa asupra unui set de date.
Procedurile
au fost introduse in domeniul bazelor de date firma Sysbase Inc., in produsul
SQL server, la sfarsitul anilor '80.Aceste proceduri au fost create
si apoi stocate ca parte a bazei de date la fel ca si tabelele
si indecsii.Transact-SQL permite introducerea in apelurile de
proceduri stocate si a parametrilor de intrare si a celor de
iesire.Astfel, procedurile pot fi create intr-o maniera eleganta,
in sensul ca variabilele pot fi transferate dintr-una in alta.
Una
dintre marile avantaje ale procedurilor sta in proiectul lor de
executie.Atunci cand executa un set mare de instructiuni pe
un server de baze de date prin retea, aplicatia este in
comunicatie permanenta cu serverul respectiv(pentru aplicatiile
cu un singur utilizator aceasta nu e problema, dar apare intrebarea
daca pentru o aplicatie cu un singur utilizator este necesar un
server de baze de date).Aceasta comunicatie intre server si statia de lucru poate
incarca rapid reteaua de calculatoare cu un trafic imens. Pe
masura ce tot mai multi utilizatori sunt implicati in
comunicatie, performantele retelei si ale serverului de
baze de date devin tot mai putin performante.
Folosind
proceduri stocate, programatorul reduce foarte mult aceasta
comunicate cu serverul de baze de date.Dupa executarea unei proceduri
stocate, instructiunile SQL sunt executate secvential pe serverul de
baze de date.Numai in cazul in care procedura stocata se termina cu
un mesaj sau cu un set de date, este redat controlul calculatorului
utilizatorului.Aceasta metoda determina o crestere a
performantei.Sunt si alte avantaje, la fel de bune, ale acestei
metode.Procedurile stocate sunt compilate de sistemele de gestiune ale bazelor
de date atunci cand sunt utilizate prima data.De aceea,
instructiunile SQL nu trebuie sa fie re-optimizate la fiecare
executie.De asemenea, si aceasta determina la cresterea
performantei.
Sintaxa
unei declaratii de procedura stocata este de forma:
CREATE PROCEDURE nume_procedura
@nume_parametru1 tip_de_data,[@parametru2 tip_de_data.],
[@nume_parametru
tip_de_data output] AS
SQL
stqtements.
Numele parametrilor de intrare trebuie
sa inceapa cu @ si trebuie sa fie urmate de tipuri de
data valide in limbajul SQL.In plus parametrii de iesire trebuie
sa succedata de sintaxa OUTPUT. Proceduriel pot fi imbricate pentru a creste modularitatea
programarii.
Aceasta inseamna ca o
procedura poate apela o alta procedura rezidenta care la
randul ei apeleaza o alta procedura si asa mai
departe.Imbricarea procedurilor este o metoda excelenta din cateva
motive.
Primul
ar fi reducerea celor mai complexe interogari la un nivel functional.
Un alt motiv excelent pentru imbricarea procedurilor este performanta.
Programul de optimizare a interogarilor realizeaza optimizarea unor
grupuri mai mici si mai compacte de interogari mult mai eficient
decat pentru un singur grup mare de instructiuni.
Este un
lucru recunoscut ca SQL nu beneficiaza de o interfata prea prietenoasa
dar acesta impresie se pastreaza doar pentru inceput. Un alt
avantaj il constituie posibilitatea de legare la mai multe servere SQL in
functie de necesitati. Conectarea la un server se face intai cu
ajutorul ,,SQL Server Client Configuration" (Start->Setings). Se permite
conectare la diferite servere prin utilizarea a diferite protocoale TCP/IP(se
precizeaza alias-ul computerului server si portul pe care se face
legatura),IPX/SPX(prin precizarea alias-ului serverului, a adresei de
retea).Demonstrand o mare mobilitate, SQL mai permite conectarea utilizand
diferite protocoale cum ar fi: Apple Talk, Banyan Vines, etc. odata intrat
in Enterprise Manager se pot defini baze de date la care se pot seta mai
multi parametri cum ar fi inclusiv modul de crestere al bazei de
date. In primul rand in cadrul unei baze de date se pot defini pentru
aceasta baza de date o serie de users si pentru fiecare dintre
acesti users drepturi foarte bine specificate de acces.Pentru a se evita
ca la fiecare dintre users sa se faca setari, pentru mai
multi users care intra intr-un grup de interes se poate defini un
role in cadrul caruia se seteaza drepturile astfel ca la
aparitia unui nou user el va fi atribuit direct la acel grup drepturiile
de acces fiind-ui automat setate.Acest lucru se face din ,,Databases users"
si ,,Databases Roles".Drepturile de acces sunt atat de bine descompuse
incat ajung la nivel de drept de insert,update,stergere sau executie
in cazul unei proceduri.Se mai pot executa wiews.Mecanismul de generare a vederilor
este foarte bine pus la punct oferind o mare rapiditate si
eficienta in crearea lor. Definirea de tabele se face tot in acest
meniu.Un mare avantaj al SQL-ului este ca in definirea tabele se pot deta
o serie de optiuni:allows null,default values,etc.
Alt avantaj il reprezinta numarul mare
de tipuri de date predefinite: de la cele uzuale int,char,varchar sau varint pana la
money,smalldatatime,uniqueidentificator sau image.Acest lucru reprezinta
un mare avantaj extinzand efectiv domeniul de aplicabilitate al
programului.Unele dintre cele mai importante instrumente pe care SQl-ul le mai
pune la dispozitie sunt procedurile stocate.Acestea permit definirea de
seturi operatii complexe asupra datelor si ce este cel mai important permit apelul lor din alte
medii de programare ceea ce ne permite sa executam intreaga
suita de operatii asupra datelor doar prin intermediul SQL-ului
celalat program fiind pastrat doar pentru interfata.Acesta
lucru este aplicat de mine in acest proiect.
De asemeni avem posibilitatea definirii de proprii
tipuri de date cu USER DEFINED DATATYPE.Se mai pot definii si diagrame cu
ajutorul DATABASES DIAGRAMS.La aceste doua ultime facilitati am
renuntat :nu am avut nevoie de definirea unor noi tipuri si la
diagrama bazei de date am renuntat pentru ca am dorit sa
controlez singur integritatea referentiala( cu diagrama
creata nu as fi putut sa sterg intotdeauna ceea ce doream
mai ales daca ).
De cele mai multe ori unele date se introduc
simultan in mai multe tabele deodata ceea ce implica complicatii
la stergere sau modificarea lor.In cazul meu neutilizand diagramele bazei
de date singurul instrument de control al integritatii
referentiale si al corectitudinii datelor corespondente din diferite
tabele il reprezinta abilitatea programatorului.O abordare gresita a acestei probleme poate
duce la aparitia de date eronate prin modificarea unor date intr-un tabel
si nerealizarea acestor modificari in alte tabele unde mai apar
aceaste date.In acest scop ,SQL-ul ofera posibilitatea definirii de triggers.Aceste
proceduri explozive se ataseaza unui tabel si se
declanseaza automat la executia unuia dintre cele 3
operatii de baza:insert,delete,update.Astfel cu ajutorul acestui
trigger se poate defini o stergere complexa din mai multe tabele a
unei date care se sterge din tabelul respectiv.
O alta problema intalnita o
reprezinta transferul de imagini.Acestea sunt BLOB-uri(Binary Large
Objects).S-a propus la inceput pastrarea caii catre
imagine.Tin sa atrag atentia asupra acestei solutii care nu
rezolva problema ci o ocoleste cauzand distrugerea consistentei
informatiei si incapsularea tabelei.Aceste lucruri se pot intampla
prin simpla mutare a directorului unde sunt imaginile depuse.In fapt SQL
permite foarte bine lucrul cu Blob-uri, pentru imagini avand, dupa cum am
mai spus, campuri de tip imagine.Acestea sunt reprezentate in campuri sub
forma de biti.Pentru a optimiza transferul avand in vedere
dimensiunea mare a fisierului de copiat, am ales ca solutie
utilizarea utilitarului BCP(Bulk COPY).Voi face o scurta prezentare a
acestui utilitar extrem de util.Are ca parametrii tabela de in/out, felul
operatiei in/out ,fisierul de iesire sau intrare precum si
o serie de optiuni.
" bcp database..table felul_operatiei
-f"cale_fisierul_format"fisierul_sursa -Sserver -Uuser -Pparola"
felul_operatiei
:in sau out;
-f
"fisier_format.FMT":fisierul format reprezinta un fisier
care este construit interactiv la primul transfer al unui fisier de un
anumit tip si care contine parametrii transferului.
-S
numele serverului SQL cu care se doreste a se lucra.
-U
numele userului care va realiza tranzactia.In cazul in care nu se
introduce corect acest nume tranzactia nu va fi realizata
generandu-se un mesaj de eroare.
-P
parol pentru atestare userului.Similara este reactia sistemului la
introducerea unei parole gresite.
Acest utilitar poate fi apelat din Command
prompt in forma prezentata mai sus angajand utilizatorul intr-un transfer
interactiv completandu-se date specifice transferului(fisierul fmt), sau
se poate apela in cadrul Query Analyzer avand o comanda de forma:exec
master..xp_cmdshell(" bcp database..table felul_operatiei
-f"cale_fisierul format"fisierul _sursa -Sserver -Uuser -Pparola").Acest utilitar
realizeaza copierea unui fisier intr-o baza de date si invers
prin copierea masiva a informatiei.Cu acest utilitar se poate copia
orice tip de informatie de la text pana la imagini.
Am
discutat despre securitatea informatiei in acest program.Se va putea
observa ca dispunem de o dubla securitate :una oferita de
program si un oferita de SQL.Voi aborda intai cea oferita de
aplicatie. Securitatea informatiei este asigurata prin impunerea
de restrictii asupra drepturilor de acces ale utilizatorilor la program in
functie de loginul si parola introdusa.Daca nu se are parola
corecta, nu se pot face anumite modificari asupra datelor.De asemeni
SQL-ul introduce si el sistemul lui de securizare a datelor.Una dintre
metodele de securizare a
informatiei este accea ca informatia specifica
fiecarei baze de date este accesibila doar din SQL, din
exterior(windows explorer,norton comander, etc) fiind vizibile doar doua
fisiere cu extensia:MDF si LDF(pentru date si pentru
log-uri).Aceste fisiere nu pot fi sterse in mod normal dar
exista posibilitate stergerii lor prin artificii.Al doilea punct
forte al securitatii bazelor de date il reprezinta posibilitatea
definirii de utilizator,roles si a drepturilor acestora.
Dupa
cum am evidentiat, o caracteristica a aplicatiei o
reprezinta proiectarea ei ca si aplicatie client-server.Aceasta
tehnologie introduce procesarea separata intre calculatoarele client
si server de baze de date, oferind o modificare radicala de la
programarea aplicatiilor bazate pe calculatoare mainframe.Din numeroasele
avantaje oferite de aceasta arhitectura se remarca
urmatoarele :
reducerea
costurilor de intretinere
reducerea
incarcarii retelei( procesarea are loc fie pe un server de baze
de date fie pe un calculator client)
mai
multe sisteme de operare pot interopera atata timp cat folosesc un protocol de
retea comun
cresterea
integritatatii datelor datorate plasarii lor centralizate
Bernard H. Boar a definit tehnologia
client/server astfel:
"tehnologia client server este
modul d procesare in care o singura aplicatie este folosita in
comun de mai multe procesoare (front-end si back-end), care
coopereaza (intr-un mod transparent pentru utilizator) pentru terminarea
procesarii ca pe un singur task unificat.Un produs client/server
combina impreuna procesoarele pentru a asigura o singura imagine
a sistemului (iluzie).Resursele partajabile sunt pozitionate la
clientii care au cereri care acceseaza servicii
autorizate.Aceasta arhitectura este total recursiva ; pe
rand serverele pot deveni clienti si pot cere servicii de la alte
servere din retea si asa mai departe "
Acest tip de dezvoltare de aplicatii
a generat nevoia unui set de instrumente de programare complet diferite de cele
existente.Programarea interfetei utilizator este acum scrisa pentru
interfetele grafice cu utilizatorul, indiferent ca este vorba de MS
Windows, IBM OS/2, Apple Machintos.Folosind SQl o conexiune la retea ,
aplicatia poate realiza interfata cu o baza de date
existenta pe un server la distanta.Datorita puterii
crescande a hardware-ului calculatoarelor personale, informatiile
critice(importante) ale bazei de date pot fi memorate pe un server independent
relativ ieftin.
Una
dintre marile avantaje SQL este ca acesta este un adevarat limbaj
pentru pentru platforme combinate.Mai mult de atat, este virtual un limbaj
produs combinat pentru platforme combinate.Deoarece este, de asemenea ceea ce
programatorii numesc 8n limbaj de nivel inalt sau de a patra generatie (4GL), se poate realiza foarte foarte mult
numai in cateva linii de cod.
Oracle
Corporation a lansat pe piata primul SGBDR care folosea SQL.Desi
versiunea originala a fost dezvoltata pentru sisteme VAX/VMS, Oracle
a fost unul dintre primii furnizori care a lansat o versiune DOS a sistemului
propriu de gestiune bazelor de date relationale.La jumatatea anilor
'80 Sybase a lansat pe piata propriul sau SGBDR ,SQL
server.Avand biblioteci de client pentru accesul la baza de date,
asigurand supoertul pentru biblioteci de functii rezident si
interoperabilitate cu diverse sisteme de operare.Unul dintre cele mai puternice
puncte pentru sistemele amintite este scalabilitatea lor pe diferite platforme
de lucru.
Firul
comun in dezvoltarea tuturor aplicatiilor client/server este folosirea SQL
si a bazelor de date relationale.De asemenea, folosirea acestei
tehnologii de baze de date intr-o aplicatie comerciala mono-utilizator
pregateste aplicatia pentru dezvoltarea si scalabilitatea
ulterioara.In plus odata cu dezvoltarea si aparitia
instrumentelor de dezvoltare client/server(Visual Basic,Borland Delphi, ODBC,
Visual C++) si mutarea catorva baze de date mari pe platforma PC,
majoritatea aplicatiilor comerciale dezvoltate in zilele noastre
necesita cunostinte de SQL.
Dupa cum s-a observat, un
pret foarte mare se pune pe viteza de raspuns a aplicatiei la
interogari.Optimizarea interogarilor este un proces important. De
obicei reorganizarea se face dupa testarea sidezvoltarea la un nivel
satisfacator al interogarilor si a secventelor de
cod.In continuare am sa descriu cateva dintre metodele uzuale de
crestere a performantei interogarilor.Cateva dintre ele le-am
folosit si eu.
Conversia
tuturor interogarilor de mari dimensiuni care sunt executate mai des, in
proceduri rezidente.Aceasta metoda reduce traficul pe retea
si are ca rezultat in baza de date o procedura rezidenta
pre-compilata in locul unei interogari de mari dimensiunicare trebuie
re-optimizata la fiecare executie.
Crearea
indecsilor care maresc performanta interogarilor in special
a jonctiunilor .
Indecsii
ar trebui creati pentru interogari care returneaza mai
putin de 5 la suta din liniile unui tabel
Indexarea
coloanelor care sunt folosite in clauza WHERE
Indexarea
coloanelor care sunt folosite de obicei in clauzele JOIN
Ne
-indexarea coloanelor care contin un numar redus de valori distincte.O indexare indexare in acest caz nu
duce la o imbunatatire a performantei(de fapt o alegere
proasta a unui index poate sa incetineasca foarte mult o
interogare )
Clauzele Group By
si subinterogarile sunt executate mult mai incet decat decat
jonctiunile.In situatiile in care doua coloane indexate pot fi combinate impreuna, este
bine sa se procedeze astfel, deoarece este un procedeu mult mai rapid de
returnare a datelor decat folosirea subinterogarilor.