Documente Academic
Documente Profesional
Documente Cultură
5
6
1. Sisteme de gestiune a bazelor de date.
Componentele și funcţiile unui sistem de gestiune
a bazelor de date
7
apar și pași de prelucrare care au drept scop optimizarea execuției interogării
respective. [2]
Cererile de acces la fișierele fizice, rezultate din transformarea
interogării, sunt preluate și rezolvate de către un sistem de gestiune a
fișierelor. Acesta poate fi un sistem general, parte a sistemului de operare care
găzduiește baza de date, sau un sistem specializat, adaptat cerințelor speciale
ale sistemului de gestiune a bazelor de date. Datele extrase din fișierele fizice,
sub forma unor șiruri de biți, parcurg apoi calea inversă, rezultatul
transformărilor succesive fiind un răspuns formulat în termenii cunoscuți de
utilizator (sub formă de tabele, rapoarte, etc.). [2]
Prin urmare, principalele funcții ale unui SGBD vizează [1]:
• Descrierea ansamblului de date la nivel fizic și conceptual;
• Crearea (inițializarea) și exploatarea (consultarea și actualizarea) bazei
de date;
• Controlul integrității bazei de date;
• Confidențialitatea informațiilor conținute în baza de date;
• Accesul simultan al mai multor utilizatori la informații;
• Securitatea în funcționare;
• Furnizarea unui set de comenzi și instrucțiuni, necesare atât
utilizatorilor pentru consultarea directă a bazei de date, prin
intermediul DML, cât și programatorilor, pentru redactarea
programelor de lucru cu baza de date;
• Revizia și restructurarea bazei de date;
• Monitorizarea performanțelor.
SGBD conține trei limbaje pentru proiectarea și exploatarea bazelor de
date, și anume:
• Limbaje de definire a datelor
• Limbaje de manipulare a datelor
• Limbaje de control al datelor.
8
A. Limbaje de definire a datelor
Arhitectura unei baze de date este specificată printr-o serie de definiții
redactate sub formă de instrucțiuni scrise în limbajul de definire a datelor,
DDL (Data Definition Language). Execuția acestor definiții se materializează
într-un ansamblu de tabele, tabele virtuale, proceduri stocate, secvențe, etc.
care sunt memorate într-un fișier special, denumit dictionar de date. Un
dicționar de date conține, așadar, metadate, adică date relative la alte date,
fiind consultat înaintea oricărei citiri sau modificări a datelor din baza de date.
[1].
Cel mai important limbaj dedicat bazelor de date, SQL (Structured Query
Language), prezintă comenzi DDL cum ar fi: CREATE / ALTER / DROP
TABLE, CREATE / ALTER / DROP VIEW, CREATE / DROP INDEX,
CREATE / DROP PROCEDURE, CREATE / DROP TRIGGER, CREATE /
DROP SEQUENCE, etc.
B. Limbaje de manipulare a datelor
Prin intermediul instrucțiunilor DML (Data manipulation Language) se
efectuează următoarele operațiuni:
11
Serverul MySQL reprezintă una dintre cele mai bune soluţii pentru
stocarea bazelor de date (în această categorie concurând cu PostgreSQL).
Prin stabilitate şi simplitate, a câştigat teren în domeniul aplicaţiilor Web.
Oferă posibilităţi asemănătoare serverelor de baze de date proprietare, fiind
renumit prin viteza mare de execuţie a interogărilor simple [4].
O caracteristică importantă a serverului MySQL este aceea că la el se
pot conecta mai mulţi clienţi simultan. Clienţii pot folosi mai multe baze de
date simultan. Se poate obţine acces la MySQL în mod interactiv, folosind
numeroase interfeţe care permit introducerea de interogări şi vizualizarea
rezultatelor: clienţi în linie de comandă, browsere Web sau clienţi X Window
System. De asemenea, este disponibilă o varietate de interfeţe de programare
pentru limbaje precum C, Perl, Java, PHP şi Python. Astfel, oferă
utilizatorului opţiunea de a folosi programe client preambalate sau de a-şi
scrie propriile programe client pentru aplicaţii personalizate [4].
MySQL poate fi folosit integral în reţele, iar bazele de date sunt
accesibile de oriunde din Internet, se pot partaja datele cu oricine, oriunde.
Dar MySQL are controlul accesului, astfel încât persoanele care nu au dreptul
să citească anumite date nu vor avea această posibilitate. MySQL rulează pe
numeroase varietăţi de UNIX, precum şi pe alte sisteme non-UNIX, ca
Windows şi OS/2. MySQL rulează pe echipamente de la calculatoare de
birou la servere cu performanţe ridicate [4].
12
3. Implementarea și popularea unei baze de date
utilizând SGBD-ul MySQL
13
Este exemplificată, de asemenea, și instrucțiunea INSERT SQL de
manipulare a datelor (DML) [8].
14
Structura bazei de date considerată ca studiu de caz se poate vizualiza
în Figura 1.
15
16
4. Tabele virtuale în interogări
Una din cele mai comune utilizări ale vederilor constă din
ascunderea elementelor complexe ale limbajului SQL, ceea ce implică,
deseori, utilizarea uniunilor.
De exemplu, vederea de mai jos [8] unește două tabele
(date_identificare și studii) pentru a returna o listă a tuturor absolvenţilor
universităţii, pe specializări şi promoţii.
17
Pentru a regăsi o listă a absolvenților specializării “Informatica”, se
va proceda astfel:
18
Utilizarea vederilor pentru reformatarea datelor regăsite
20
Pentru selectarea absolvenţilor care au domiciliul în străinătate, este
necesar ca în clauza where să se elimine înregistrările pentru care câmpul
tara_domiciliu conține valoarea “Romania” [8].
21
În mod similar, au fost selectați și afișați absolvenții (nume, prenume
şi specializare) care au găsit un loc de muncă în timpul studiilor sau la mai
puţin de un an de la absolvire [8].
22
De remarcat este faptul că este indicată crearea vederilor refolosibile,
așa cum a fost procedat în exemplul anterior. Extinderea domeniului de
acțiune al vederii (prin nelegarea acesteia de anumite date) o face mai utilă
și elimină necesitatea de creare și întreținere a mai multor vederi
asemănătoare.
MERGE
Algoritmul MERGE determină MySQL să combine definiția vederii
cu orice alte clauze în momentul execuției acesteia [7].
În exemplul de mai jos, definiția vederii și interogarea select au fost
îmbinate (merge).
23
TEMPTABLE
Când o vedere are asignată opțiunea TEMPTABLE, un tabel
temporar corespunzător este creat în momentul creării vederii.
UNDEFINED
Când o vedere are proprietatea UNDEFINED (implicită), MySQL
încearcă să determine care dintre cei doi algoritmi (MERGE sau
TEMPTABLE) ar trebui să fie utilizat. Având în vedere că sunt puține
situații în care algoritmul TEMPTABLE este preferat (de exemplu când sunt
utilizate în interogare funcții agregat), algoritmul MERGE este, în general,
mai eficient. MySQL va alege opțiunea TEMPTABLE doar dacă interogarea
denotă o relație de unu-la-unu între rezultatele sale și cele găsite în vedere
[7].
24
Utilizarea opțiunilor de securitate pentru vederi
[DEFINER = { user | CURRENT_USER }]
[SQL SECURITY { DEFINER | INVOKER }]
25
26
5. Rutine stocate în SGBD
27
Rutinele stocate în serverul SQL sunt similare procedurilor din alte
limbaje de programare, în sensul că [5]:
• Acceptă parametri de intrare de la programul apelant și returnează
valori prin parametri de ieșire către acesta.
• Conțin instrucțiuni de programare care efectuează operații în baza de
date și pot apela, la rândul lor, alte rutine stocate.
• Returnează către apelant o valoare care indică succesul sau eșecul
execuției acesteia, și, eventual, cauza eșecului.
28
Apelul procedurii se realizează prin intermediul comenzii CALL urmată
de numele procedurii, și, eventual, de lista de parametri.
Rezultatul apelului este prezentat mai jos:
Exemplu
Procedura prezentată mai jos stochează informații în tabela
chestionar_joburi(id_intrebare,cnp,intrebare,raspuns) prin utilizarea unei
comenzi INSERT [8].
Primul pas a constat în scrierea comenzii CREATE TABLE pentru
definirea structurii tabelei date:
29
A urmat, apoi, scrierea corpului procedurii init_chestionar, cu variabila
cnp dată ca parametru de intrare [8].
5.2 Declanșatoare
Declanșatoarele (trigger-ele) sunt o clasă specială de proceduri
stocate, asociate unei tabele, definite pentru a fi lansate în execuţie automat
la iniţierea unei operaţii de tip UPDATE, INSERT sau DELETE asupra
tabelei în cauză [5].
Spre deosebire de procedurile stocate, declanșatoarele sunt asociate
unor tabele individuale.
Un trigger este iniţiat ori de câte ori se încearcă operaţia de modificare
corespunzătoare asupra tabelei căreia îi este ataşat. Un trigger poate conţine
instrucţiuni SQL complexe şi poate accesa datele din alte tabele. Trigger-ul şi
30
operaţia care îl declanşează sunt considerate ca un tot unitar (tranzacţie) ceea
ce înseamnă că dacă execuţia trigger-ului eşuează, dintr-un motiv sau altul,
atunci şi operaţia care a declanşat trigger-ul se anulează. O tabelă poate avea
asociate mai multe trigger-e. Instrucţiunea CREATE TRIGGER poate fi
definită cu oricare dintre clauzele FOR UPDATE, FOR INSERT sau FOR
DELETE [5].
Dacă se foloseşte clauza FOR UPDATE, atunci se poate, de asemenea,
folosi clauza IF UPDATE (nume_coloana) prin care se poate crea un trigger
specializat pentru situaţia modificării unei coloane anume. Clauza IF
UPDATE (nume_coloana) este, de fapt, un test care returnează valoarea
logică true în cazul în care coloana dată ca parametru a fost modificată de
operaţia ce a declanşat triggerul şi false în caz contrar [5].
SQL permite asocierea la o singură tabelă a mai multe trigger-e de
acelaşi tip (UPDATE, INSERT sau DELETE).
Principalele evenimente declanșator, împreună cu o scurtă descriere a
acestora [1], sunt prezentate în Tabelul 1.
Tabel 1. Evenimente declanșator
Eveniment Declanșare
Descriere
declanșator pentru fiecare
BEFORE Comandă Codul declanșatorului se lansează înaintea
INSERT executării unei comenzi INSERT în tabela-
țintă
BEFORE Linie Se execută înaintea inserării fiecărei linii în
INSERT tabelă
AFTER Linie Se execută după inserarea fiecărei linii în
INSERT tabelă
AFTER Comandă Se lansează după execuția unei comenzi de
INSERT inserare de linii în tabelă
INSTEAD OF Linie În loc să se insereze o linie în tabelă, se
INSERT execută codul din acest declanșator
BEFORE Comandă Codul acestuia se execută înaintea executării
UPDATE unei comenzi UPDATE pentru tabela-țintă
BEFORE Linie Se execută înaintea modificării fiecărei linii
UPDATE din tabelă
AFTER Linie Se execută după modificarea fiecărei linii
UPDATE
AFTER Comandă Se lansează după execuția comenzii
UPDATE UPDATE (după modificarea tuturor liniilor
afectate de comandă)
31
INSTEAD OF Linie În loc să se modifice o linie din tabela-țintă,
UPDATE se execută codul din acest declanșator
BEFORE Comandă Se execută înaintea comenzii DELETE
DELETE
BEFORE Linie Se execută înainte de ștergerea fiecărei linii
DELETE
AFTER Linie Se execută după ștergerea fiecărei linii
DELETE
AFTER Comandă Se lansează după execuția comenzii
DELETE DELETE (după ștergerea tuturor liniilor
afectate de comandă)
INSTEAD OF Linie Se execută în locul ștergerii unei linii din
DELETE tabela-țintă
32
Exemplu
Trigger-ul de mai jos se declanșează la inserarea de informații în tabela
date_identificare (prin apelul procedurii init_chestionar pentru fiecare rând
adăugat). Tabela menționată va fi populată la înregistrarea utilizatorilor în
aplicație (prin completarea de către aceștia a unui formular Web sau direct
în baza de date de către administrator) [8].
33
Pentru exemplificarea funcțiilor stocate se va utiliza baza de date
gestiunea_facturilor [8], prezentată mai jos.
34
Baza de date a fost populată cu înregistrările prezentate mai jos [8]:
35
Următoarea funcție [8] returnează toate facturile scadente din baza
de date, împreună cu data scadenței acestora. Parametrii de intrare ai
funcției sunt id_s și id_n (variabile identificate cu seria și numărul facturii în
clauzele where din cadrul instrucțiunilor SELECT aflate în corpul funcției),
data_f (reprezentând data facturii; valorile câmpului data_f sunt stocate
succesiv în variabila @data_f prin utilizarea instrucțiunii SELECT
prezentată mai jos) și termen_plată (variabilă de tipul int, corespunzătoare
câmpului termen_plata de același tip; valorile acestui câmp sunt stocate în
variabila @termen_plata prin utilizarea unei instrucțiuni SELECT). Printr-o
36
instrucțiune de atribuire SET, variabila @data_scadenta (care va fi returnată
de funcție) ia, succesiv, valorile stocate în variabila @data_f la care se
adaugă (prin intermediul funcției DATEADD(date, INTERVAL expr DAY))
termenul de plată al facturilor (ca număr zile).
37
corpul funcției. Valoarea fiecărui produs aflat pe stoc se calculează ca fiind
produsul dintre cantitatea și prețul unitar al acestuia, informații reținute în
variablele @c_p și @p_u. Rezultatul este rotunjit la 2 zecimale cu ajutorul
funcției ROUND(valoare, 2) și stocat, apoi, în variabila @valoare_f, prin
intermediul comenzii SET. Funcția returnează valorile reținute în variabila
@valoare_f (valorile tuturor produselor de pe stoc).
Funcția definită mai sus este apelată prin numele ei și prin lista de
parametri, într-o instrucțiune SELECT. Alături de valoarea produsului,
comanda afișează și seria și numărul facturii, și denumirea produsului [8].
38
Următorul exemplu [8] prezintă o funcție stocată care returnează
TVA-ul fiecărui produs dintr-o factură. Lista de parametri este aceeași cu
cea din exemplul anterior, iar TVA-ul este calculat ca raport între produsul
dintre cantitate și preț unitar (@c_p * @p_u) și valoarea 0.19. Rezultatul
este rotunjit la 2 zecimale, este stocat în variabila @tva_p și este returnat de
funcție.
39
Următoarele instrucțiuni prezintă apeluri (prin nume și lista de
parametri) în cadrul unor vederi, ale funcțiilor create mai sus [8].
40
6. Căutare rapidă. Indecși
41
Este indicată crearea unui index atunci când [9]:
• Coloana care se indexează conține o plajă mare de valori;
• Coloana care se indexează conține mai multe valori nule (valorile
nule nu sunt incluse în index);
• Una sau mai multe coloane sunt frecvent utilizate împreună în clauza
where sau în condițiile de join;
• Tabela este mare și majoritatea interogărilor returnează un număr
mic de linii din această tabelă (aproximativ 5% din numărul total de
înregistrări).
42
7. Prelucrări bazate pe cursoare
43
Fazele menționate sunt evidențiate în exemplul următor:
44
8. Drepturi și utilizatori într-un SGBD
45
pasul 5. Dacă numele de utilizator este regăsit, însă nu este prezent
numele gazdei, procesul trece la pasul 4.
4. În cazul în care se găsește un rând în tabela db cu numele de
utilizator specificat, însă numele gazdei este null, atunci va fi
examinată tabela host. Dacă numele gazdei specificat în cadrul
conexiunii se regăsește în acest tabel, atunci utilizatorul va primi
drepturile specificate în tabela host, și nu pe cele specificate în
tabela db pentru respectiva bază de date.
5. În final, dacă un utilizator intenționează să execute o comandă care
nu este permisă în tabelele user, db sau host, atunci vor fi examinate
tabelele tables_priv și columns_priv pentru a determina dacă
utilizatorul are dreptul de a utiliza comanda respectivă pe tabelele
sau coloanele specificate în cerere.
Crearea utilizatorilor
Pentru crearea de noi conturi de utilizator se folosește comanda
CREATE USER. În momentul creării, nu se acordă nici un fel de drepturi,
acestea putând fi atribuite prin utilizarea ulterioară a comenzii GRANT.
Comanda de mai jos crează utilizatorul sgbd cu parola parola_sgbd:
Ștergerea utilizatorilor
Pentru a șterge un utillizator existent, se apelează comanda DROP
USER.
47
Redenumirea utilizatorilor
Comanda RENAME USER redenumește un utilizator existent.
48
CREATE VIEW CREATE VIEW
DELETE DELETE
DROP DROP TABLE
Afectează dreptul utilizatorului de a executa
EXECUTE
proceduri stocate
EVENT Afectează dreptul de a executa evenimente
SELECT INTO OUTFILE și LOAD DATA
FILE
INFILE
Afectează dreptul utilizatorului de a stabili
GRANT OPTION
privilegii
INDEX CREATE INDEX și DROP INDEX
INSERT INSERT
LOCK TABLES LOCK TABLES
PROCESS SHOW PROCESSLIST
Este prezentă pentru facilități viitoare oferite
REFERENCES
de MySQL
RELOAD FLUSH
Afectează dreptul utilizatorului de a cere
REPLICATION CLIENT
locația serverelor master și slave
Acordă privilegii de replicare a serverelor
REPLICATION SLAVE
slave
SELECT SELECT
SHOW DATABASES SHOW DATABASES
SHOW VIEW SHOW CREATE VIEW
SHUTDOWN SHUTDOWN
CHANGE MASTER, KILL thread,
mysqladmin debug, PURGE MASTER
SUPER
LOGS și SET GLOBAL (nivel de
administrator)
TRIGGER Afectează dreptul de a executa trigger-e
UPDATE UPDATE
USAGE Doar conexiune, fără privilegii
49
Drepturile pot fi acordate unui utilizator și pe parcurs. De exemplu,
utilizatorul sgbd@localhost poate avea și drepturi de actualizare a
informațiilor din tabela produse:
50
Vizualizarea tuturor privilegiilor unui utilizator
Pentru vizualizarea tuturor privilegiilor unui anumit utilizator, se
folosește comanda SHOW GRANTS FOR.
De exemplu, pentru a vizualiza toate drepturile utilizatorului
sgbd@localhost, se va executa comanda de mai jos:
52
9. Gestiunea tranzacțiilor
53
| READ WRITE
| READ ONLY
BEGIN [WORK]
COMMIT [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
ROLLBACK [WORK] [AND [NO] CHAIN] [[NO] RELEASE]
SET autocommit = {0 | 1}
55
6. Până în momentul execuției comenzii COMMIT, modificările nu
vor fi vizibile. În cazul în care una dintre operațiile de actualizare
nu s-a efectuat cu succes, va fi apelată comanda ROLLBACK:
56
9. Comanda de validare aplicată este următoarea:
57
58
10. Replicarea bazelor de date
Replicarea bazelor de date este procesul prin care două sau mai multe
baze de date aflate în site-uri (locaţii) diferite comunică între ele, transferând
date şi informaţii. Astfel, sistemul de replicare conține unul sau mai multe
servere care supervizează şi asigură transferul informaţional între sursă şi
destinaţie, adică între terminalele unde se introduc, se modifică, se şterg şi
se prelucrează datele. La rândul lor, bazele de date sunt grupate în: baza de
date principală, care la orice moment reprezintă imaginea reală a întregului
sistem, şi replici ale acesteia, care reprezintă imaginea reală a sistemului la
un anumit moment de timp, când replica a fost creată [2], [11], [12], [13].
Fiecare server are bazele de date proprii, SGBD-ul propriu și un sistem
de gestiune a comunicațiilor propriu. Utilizatorii locali ai fiecărui server pot
exploata baza de date locală independent (la fel ca orice bază de date
centralizată) sau pot exploata baza de date distribuită prin solicitarea
accesului și la alte noduri ale rețelei. Astfel, baza de date distribuită apare ca
un obiect virtual, rezultat al cooperării dintre mai multe baze de date locale.
Această cooperare este realizată prin SGBDD care este o extensie logică a
SGBD locale. În forma sa cea mai generală, o bază de date distribuită poate
fi compusă din mai multe noduri dispersate geografic în care funcționează
diferite tipuri de SGBD locale, sub diferite sisteme de operare și pe
platforme hardware diferite. Este rolul SGBDD de a asigura conlucrarea
acestor noduri și compatibilitatea dintre sistemele locale care funcționează
în fiecare nod [2].
Exemplu
Se vor utiliza trei servere, numite după cum urmează: Server 1, Server
2 şi Server de agregare. Server 1 conţine ambele două tabele ale bazei de
date gestiunea_facturilor (clienti şi facturi), în timp ce Server2 conţine doar
tabela facturi. Tabela facturi este invizibilă pentru utilizatorii PC-ului pe
care rulează Server 1. Utilizatorii PC-ului cu Server 2 nu văd tabela clienti.
Server 2 este într-o relaţie de master-slave bidirecţional cu Server 1. În acest
mod, orice modificare din prima tabelă va adăuga o linie şi în a doua tabelă.
De asemenea, modificările de pe Server 2 vor fi replicate pe Server 1.
Server 1 şi Server 2 sunt dispersate geografic, iar serverul de agregare face
replicarea ambelor tabele pentru backup şi pentru prelucrarea datelor [14].
59
Fig. 3. Schema procesului de replicare [14]
log-bin=mysql-bin
binlog-do-db=gestiunea_facturilor
server-id = 1
60
Pentru realizarea relaţiei de master-slave bidirecţional cu Server 2, se
adaugă, în acelaşi fişier, liniile [14]:
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
log-bin-index=mysql-bin.index
log-slave-updates
replicate-do-db=gestiunea_facturilor
master-host=192.168.1.2
master-user=maria
master-password=parola12
61
Se execută în MySQL următoarele comenzi [14]:
flush privileges;
use gestiunea_facturilor;
flush tables with read lock;
unlock tables;
show master status;
mysql-
106 gestiunea_facturilor
bin.000025
mysql-bin.000025
fişier log
Descrierea formatului
eveniment
INSERT INTO clienti
bi l
VALUES (12, 0258810119);
.
.
.
62
Se exportă datele într-un singur fişier de tip sql, care va fi transferat de
pe serverul principal pe serverele secundare şi importat, mai apoi, în
MySQL-ul de pe serverele secundare [14].
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 2
log-bin=mysql-bin.log
log-bin-index=mysql-bin.index
log-slave-updates
replicate-do-table= gestiunea_facturilor.facturi
Ultima comandă a permis replicarea doar a celei de-a doua tabele din
baza de date.
În final, se execută următoarele comenzi, pe ambele servere secundare
[14]:
64
Master_log_file este fişierul log rezultat la executarea comenzii „show
master status” pe serverul principal.
Master_log_pos reprezintă poziţia MySQL rezultată la executarea
aceleiaşi comenzi „show master status” pe serverul principal.
În consola de comandă MySQL se rulează comanda de pornire [14]:
start slave;
quit;
show slave status \G;
65
66
Bibliografie
68