Sunteți pe pagina 1din 18

BAZE DE DATE RELATIONALE – MySQL

1.Introducere

Un server de baze de date(in cazul de fata MySQL) este un mediu software(un pachet de
programe) care permite stocarea unei cantitati mari de informatii intr-un format organizat(intr-o
structura organizata), usor de accesat prin intermediul unor interfete de tip client-server, grafice sau
text(implicite pentru clientul MySQL), realizate cu ajutorul unor limbaje de nivel inalt(limbaje de
script, cum ar fi PHP,Perl sau alte limbaje de nivel inalt gen C,C++,Delphi,etc).Organizarea si
administrarea informatiei in cadrul serverului de baze de date este asigurata printr-un limbaj SQL,
mai precis un dialect SQL specific serverului de baze de date.Limbajul SQL reprezinta practic
veriga intermediara intre datele stocate(informatia propriu-zisa) si interfata de actiune a clientului
(realizata intr-un limbaj corespunzator).In situatia de fata, atat serverul cat si limbajul specific
acestuia poarta numele MySQL.
Setul de comenzi utilizate pentru a spune serverului MySQL ce anume sa faca este parte a
limbajului Structured Query Language(SQL), aceste comenzi mai purtand numele de interogari
SQL(SQL queries) [Mys01].SQL este un limbaj standard interactionand cu majoritatea tipurilor de
baze de date.Astfel, la o trecere de la MySQL la InterBase(spre exemplu), se poate observa ca
majoritatea comenzilor SQL sunt aproape identice(numarul de clauze optionale si/sau
caracteristicile acestora putand fi diferite).
Entitatea majora de stocare a informatiei intr-un server de baze de date este baza de date
(DATABASE).La randul ei, o baza de date contine una sau mai multe tabele, fiecare dintre ele
continand informatii intr-un format tabelat(linii si coloane).Astfel, o tabela(TABLE) contine una
sau mai multe coloane, denumite si campuri.Fiecare coloana poate stoca un anumit tip de
informatie.Fiecare linie din cadrul unei tabele poarta numele de articol sau inregistrare.

2.Conectarea la MySQL

Interfata standard(inclusa in mediul software), care permite lucrul cu bazele de date MySQL
(interactiunea directa si gestionarea/administrarea), asigura conectarea la serverul de baze de date
MySQL si respectiv scrierea si executarea succesiva(interpretarea) a cate unei singure comenzi
SQL.Software-ul MySQL contine, in principiu, un modul server si respectiv un modul client.
Modulul client permite o conectare(inclusiv de la distanta) la serverul de baze de date. In
momentul instalarii unui server MySQL(pe o platforma Windows sau Linux), modulul client este
automat instalat impreuna cu serverul. Pe o platforma Linux, programul de conectare poarta
numele ‘mysql’(si este implicit instalat in directorul /usr/local/mysql/bin). Pe o platforma
Windows, programul se numeste mysql.exe (si este implicit instalat in directorul C:\mysql\bin).
In cazul in care serverul MySQL este instalat pe un host Web(server Internet) la distanta,
deci pe un calculator care nu este acelasi cu calculatorul client(de pe care se incearca conectarea),
cel mai simplu mod de conectare necesita utilizarea unui program Telnet sau SSH(Secure Shell)
pentru login-area la serverul Web, urmata de lansarea in rulare a programului ‘mysql‘.Este cazul cel
mai des intalnit in situatia in care MySQL-ul este instalat pe un server de Web, pe o platforma
Linux, iar clientul incearca o conectare de pe o platforma Windows. In situatia in care instalarea
serverului MySQL se face pe propriul calculator(de regula sub Windows), acesta va contine atat
modulul server cat si client. Un alt caz este cel in care pe calculatorul client(propriul computer) se
instaleaza MySQL-ul(obtinut free de la adresa http://www.mysql.com), utilizat apoi pentru
conectarea via Internet la un server MySQL.
Indiferent de metoda utilizata, conectarea clientului la serverul MySQLimploica o comanda
de genul(tastata la prompter-ul sistemului de operare):
mysql –h hostname –u username -p
unde:
- hostname este numele sau adresa IP a calculatorului pe care ruleaza serverul
MySQL.Daca programul client ruleaza pe acelasi calculator ca si programul server, optiunea –h
hostname poate fi omisa. Nu exista nici o legatura intr numele user-ului de conectare la
serverul(Linux sau Windows) pe care este instalat MySQL-ul si numele de user MySQL.
- username este numele de user.
- optiunea – p cere user-ului care se conecteaza sa introduca parola corespunzatoare(va
apare un prompt pentru parola).
Dupa instalare, un user implicit este creat pentru conectare(pentru host-ul pe care este
instalat serverul MySQL,respectiv pentru un host-client la distanta),fara nume si fara parola.In
acest caz conectarea(de pe host-ul local) se face tastand doar comanda ‘mysql’ fara parametrii(sub
Linux) sau lansand mysql.exe (sub Windows).Mai multe amanunte despre conectarea la un server
MySQL in paragraful care prezinta administrarea unui astfel de server.
In cazul unei conectari reusite, programul client MySQL va afisa prompter-ul corespunzator
liniei de comanda:
mysql>
La aparitia liniei de comanda,serverul MySQL este pregatit pentru a primi comenzi.Pentru
inceput, se vizualizeaza bazele de date care sunt momentan sub gestiunea serverului:
mysql> SHOW DATABASES ;

Observatie: Incheierea unei comenzi trebuie sa se faca neaparat prin ‘;’.In cazul in care
lipseste ‘;’ , si se tasteaza ENTER, se considera ca respectiva comanda este scrisa pe mai multe
randuri, asteptandu-se continuarea editarii comenzii,pana la introducerea caracterului ;.Altfel spus,
ENTER dupa caracterul ; inseamna executarea comenzii iar ENTER dupa orice alt caracter
inseamna continuarea editarii comenzii pe o noua linie. Spre exemplu, comanda anterioara poate fi
scrisa pe 3 linii astfel:
mysql> SHOW
->DATABASES
-> ;
Se recomanda scrierea unei comenzi de lungime mare pe mai multe linii.Executia comenzii
SHOW DATABASES are urmatorul efect pe ecran:
Database
mysql
test
2 rows in set (0.00 sec)

Serverul MySQL-ul utilizeaza o prima baza de date, numita ‘mysql‘ , pentru a stoca numele
user-ilor, parolele corespunzatoare acestora si drepturile lor(in diverse tabele, asupra carora se va
reveni).Stergerea acestei baze de date(operatie nerecomandata) poate conduce la erori in
functionarea server-ului.
A doua baza de date(test) este un exemplu de baza creata implicit in urma instalarii fiind,
dupa cum ii spune si numele, o baza pentru testare.Aceasta baza de date poate fi stearsa oricand, cu
o comanda de genul:
mysql> DROP DATABASE test ;
In urma unei astfel de comenzi(tastand ENTER), serverul returneaza, ca si confirmare a
executarii operatiei, mesajul :’QUERY OK’.A se observa ca nu se cere inca o confirmare a intentiei
de stergere, astfel incat este necesara o atentie deosebita cu comenzile DROP DATABASE care pot
distruge informatii(stergand irevocabil o baza de date).
In cazul in care, in timpul scrierii unei comenzi, se constata ca aceasta este gresita sintactic
sau va executa o operatie nedorita, se poate renunta la ea prin postfatarea ei cu sirul ‘\c’, inainte de
incheierea ei prin ; ,astfel revenindu-se la o linie noua, pe care se poate scrie o alta comanda.
Cu alte cuvinte sirul ‘\c’ conduce la abandonarea executiei comenzii curente, aceasta fiind
ignorata.Spre exemplu :
mysql> DROP DATABASE test \c
mysql>
Iesirea din programul client MySQL se face prin comenzile ‘quit’ sau ‘exit’.Acestea sunt
singurele comenzi care nu trebuie incheiate prin punct-si-virgula ; .
mysql> quit
Bye

3.Operatii MySQL

3.1.Crearea unei baze de date

Primul pas la crearea unei aplicatii cu MySQL consta in crearea unei baze de date ca prim
nivel ierarhic pentru stocarea informatiei.Comanda pentru crearea unei baze de date cu numele
‘test’, spre exemplu (presupunand ca nu exista deja creata o baza cu un asemenea nume) este :
mysql> CREATE DATABASE test ;
In acest moment, baza de date ‘test’ este creata, dar pentru a putea lucra cu ea trebuie
deschisa printr-o comanda prin care i se comunica serverului MySQL care este baza de date activa
in acel moment :
mysql> USE test ;
Operatia imediat urmatoare crearii unei baze de date (vide in acest moment) consta in
crearea unor tabele in aceasta.Crearea unei baze de date conduce (din punct de vedere a sistemului
de operare) la creareaunui nou director.Daca se doreste exportareaunei baze de date de pe un server
MySQL pe altul,este suficienta copierea directorului respective,impreuna cu tot continutul
lui.Crearea unei noi tabele implica crearea a trei fisiere (cu acelasi nume si alte extensii) plasate
evident in directorul corespunzator bazei curente.

3.2.Crearea unei tabele

In cele ce urmeaza, se va face o exemplificare pentru o tabela cu o structura simpla, astfel


ca si comanda pentru crearea acesteia constituie doar un caz particular.De retinut totusi ca,
deoarece tabelele sunt atat de flxibile iar structura unei baze de date poate fi atat de elaborata,
comanda pentru crearea unei tabele pote fi extrem de complexa.Sintaxa principala a unei astfel de
comenzi este de forma :
mysql> REATE TABLE table_name (
-> column_1_name column_1_type column_1_details
-> column_2_name column_2_type column_2_details
->. . .
->) ;
Pentru exemplificare, se va crea o tabela numita TABEL1.Tabela este structurata pe trei
coloane:NUME (continand numele unei anumite persoane in formet TEXT), DATA(data nasterii
acelei personae, intr-un format DATE corespunzator datei calendaristice) si un camp special
ID,care permite o identificare unica pentru fiecare articol din tabela (fiecarui articol ii corespunde
un ID distict, reprezentat printr-un numar intreg INT).
Comanda pentru crearea acestei tabele este urmatoarea:
mysql> CREATE TABLE tabel1 (
->ID INT NOT NULL AUTO_INCREMENT PRIMARY KEY ,
-> nume TEXT,
-> data DATE NOT NULL
-> );
Comentand comanda anterioara, se pot remarca urmatoarele:
• prima linie precizeaza numelei tabelei care va fi create:tabel 1
• linia a doua precizeaza numele ID al primei coloane din tabela si tipul acesteia INT (adica
va putea stoca doar numere intregi).Ceilalti parametric ai liniei precizeaza cateva detalii
specfiale (constrangeri) referitoare la aceasta coloana:NOT NULL-coloana nu poate
contine elementul NULL (adica sa nu contina nimic), AUTO_INCREMENT-in
momentul adaugarii unei noi inregistrari (linii) in tabela, continutul acestei coloane
corespunzator noului articol va fi completat automat de catre server, fiind cea mai mare
valoare din coloana incrementata cu o unitate, si in sfarsit, PRIMARY KEY-valorile din
aceasta coloana sunt unice pentru fiecare articol.
• linia a 3-a defineste o a doua coloana de tip TEXT avand numele ‘nume’
ultima linie defineste a 3-a coloana cu numele ‘data’, de tip DATA si care nu poate ramane
necompletata (NOT NULL)
Observatie:MySQL nu este case-sensitive (se pot folosi atat caractere mari cat si mici,
fara a se face distinctie intre ele), exceptie facandu-se atunci cand serverul MySQL lucreaza pe
o platforma UNIX, caz in care numele de baze de date si tabele corespund unor directoare si
fisiere UNIX si trebuie tinut cont de modul exact cum sunt numite acestea (caractere mari sau
mici)
Executia acestei comenzi este urmata de raspunsul serverului ‘Query OK’ confirmand
crearea tabelei.Comanda Urmatoare listeaza tabelele din baza de date curenta :
mysql> SHOW TABLES ;
Evident, lista va contine o singura tabela :
Tables_in_test
Tabel1
1 row in set (0.00 sec)
O descriere a tabelei nou create se poate face cu comanda :
mysql> DESCRIBE tabel1 ;
avand ca rezultat afisarea unor informatii despre structura tabelei :
Field Type Null Key Default Extra
ID int (11) PRI 0 auto_inc
nume text YES NULL
data date 0000-00-00
3 rows in set
Daca se doreste stergerea unei tabele din baza de date curente, comanda este :
mysql> DROP TABLE numele_tabelei ;

3.3.Adaugarea de date intr-o tabela

Odata creata tabela, ceea ce mai ramane de facut pentru a o putea utiliza la ceva, consta
in stocarea unor informatii in aceasta.Comanda pentru adaugarea unui nou articol (o noua linie)
intr-o tabela are doua forme.Sintaxele principiale ale acestora sunt :
mysql> INSERT INTO nume_tabela
-> ( Nume_coloana1, Nume_coloana2, ...)
-> VALUES (valoare1, valoare2, …);
respectiv
mysql> INSERT INTO nume_tabela SET
-> Nume_coloana1= valoare1,
-> Nume_coloana2= valoare2,
-> …
-> ;
Spre exemplu, urmatoarele doua comenzi sunt echivalente:
mysql> INSERT INTO TABEL1 SET nume=’Dan’, data=’2002-05-2
sau
mysql> INSERT INTO TABEL1 (nume,data) VALUES (‘DAN’, ‘2002-05-27’)
Inserarea datei curente se poate realize utilizand cuvantul cheie CURRENT_DATE:
mysql> INSERT INTO TABEL1 (NUME, DATA)
-> VALUES (‘IOAN’, CURRENT_DATE);
Introducerea de date dintr-un fisier text, in care inregistrarile sunt pozitionate pe linie, iar
elementele unui articol sunt delimitate de TAB:
mysql> LOAD DATA INFILE “fisier. txt” INTO TABLE tabel1;

3.4.Vizualizarea datelor dintr-o tabela

Comanda SELECT, utilizata pentru vizualizarea datelor dintr-o tabela, este cea mai
complexa comanda a limbajului SQL.Motivul acestei complexitati rezida din insasi ‘forta’ si
flexibilitatea unei baze de date de a stoca si prezenta datele.
Cea mai simpla sintaxa de utilizare a comenzii SELECT, particularizata la exemplul
considerat si pana acum, este :
mysql> SELECT * FROM tabel1 ;
avand urmatorul rezultat :

ID NUME DATA

1 ION 2002-04-25
2 DAN 2002-05-27

2 rows in set (0.06 sec)


Comanda este echivalenta cu (pentru tabela mai sus referita) :
mysql> SELECT id, nume, data FROM tabel1 ;
Sintaxa comenzii SELECT este mult mai complexa.In continuare vor fi prezentate
doar cateva particularizari de utilizare a acesteia.
Pentru afisarea datei calendaristice curente este utilizat cuvantul cheie
CURRENT_DATE.Astfel comanda:
mysql> SELECT CURRENT_DATE
returneaza data curenta :
CURRENT_DAT
E
2002-06-10
1 row in set (0.00 sec)
De asemenea, comanda:
mysql> SELECT YEAR (CURRENT_DATE);
returneaza anul corespunzator datei curente:
year
(current_date)
20
02
1 row in set (0.00 sec)
Pentru a numara articolele dintr-o tabela se utilizaeza functia COUNT.Astfel comanda:
mysql> SELECT COUNT(*) FROM tabel1;
va returna numarul total de articole din tabela referita :
count
(*)
3
1 row in set (0.55 sec)
Se pot impune conditii pentru numararea articolelor care indeplinesc o anumita
conditie :
mysql> SELECT COUNT(*) FROM TABEL1 WHERE DATA>”2002-06-09”;
va returna
COUNT (*)

1
1 row in set (0.00 sec)
De asemenea se pot folosi si clause suplimentare.Spre exemplu, in comanda urmatoare,
functia LEFT va permite afisarea unei colone suplimentare obtinuta pe baza campului (coloanei)
nume, trunchiata la primele 2 caractere din stanga :
mysql> SELECT id, nume, LEFT(nume, 2) FROM tabel1;
returnand:
i num left
d e (nume,2)
1 ION IO
2 DAN DA
3 IOAN IO
3 rows in set (0.11 sec)
Utilizarea functiei LIKE si a caracterului special % (care inlocuieste un sir de caractere
oarecare) in comanda SELECT are ca effect o interogare cu cautare aproximativa.Astel comanda:
mysql> SELECT nume FROM tabel1 WHERE nume LIKE “%io%”;
returneaza acele linii (nume) pentru care campul ‘nume’ contine sirul ‘io’:
num
e
ION
IOAN
2 rows in set (0.00 sec)
Evident ca pot fi utilizate si conditii multiple, folosind operatorii logici (AND in cazul
de fata):
mysql> SELECT id, nume FROM tabel1 WHERE nume LIKE “io%”
->AND data> “2002-04-02”
avnd ca rezultat:
i num
d e
1 ION
3 IOAN
2 rows in set (0.00 sec)

3.5. Modificarea datelor dintr-o tabela

Odata datele introduce intr-o tabela a bazei de date, apare foarte des necesitatea de
modificare a acestora (fie din motive de corectare a unor eventuale greseli, fie pentru o simpla si
necesara reactualizare a acestora).Comanda UPDATE, folosita pentru modificarea datelor dintr-o
tabela, are urmatoarea sintaxa generala:
mysql> UPDATE table_name SET
-> col_name = new_value, …
-> WHERE conditions;
Spre exemplu, daca se doreste modificarea datei corespunzatoare articolului cu id-ul
1 din tabela ‘tabel 1’, se scrie o comanda de genul :
mysql> UPDATE tabel1 SET data=”1999-06-02” WHERE id=1;
Sau, daca se doreste o reactualizare a datei pentru toate articolele al caror ‘nume’ care incep cu
sirul de caractere ‘io’:
mysql> UPDATE tabel1 SET data=”1999-06-01”
-> WHERE nume LIKE “io%”;
Efectul modificarii efectuate este present pe ecran sub forma unui mesaj de
confirnare:
Query OK, 2 rows affected (0.11 sec)
Rows matched: 2 Changed: 2 Warnings: 0
O situatie speciala a constitue modificarea/incarcarea unui camp de tip BLOB (cu o imagine spre
exemplu).Spre exemplificare, o astfel de operatie utilizeaza functia
LOAD_FILE(“cale\\nume_fisier_sursa”), si se poate face cu o comanda de genul:
mysql> UPDATE tabel3 SET imag=LOAD_FILE(”c:\\dan.jpg”) WHERE id=3;
S-a folosit functia LOAD_FILE pentru precizarea fisierului sursa care va fi
incarcat in tabela (evident, tabela avand un camp “imag” de tip BLOB).De remarcat dublarea
caracterelor ‘\’ care apar calea spre fisierul sursa (pentru o platforma WINDOWS).
3.6. Stergerea datelor dintr-o tabela

Stergerea unei/unor inregistrari dintr-o tabela se poate face extreme de


simplu.Sintaxa comenzii este urmatoarea :
mysql> DELETE FROM tabel_name WHERE conditions;
Spre exemplu, pentru a sterge toate articolele pentru care datele din campul “nume”
incep cu sirul de caractere ‘io’ (nu se face distinctie intre caracterele mari si mici), se foloseste o
comanda de genul:
mysql> DELETE FROM tabel1 WHERE nume LIKE “io%”;
De remarcat ca, pentru MySQL, clauza WHERE este optionala.Ne utilzarea
acestei clause trebuie facuta cu mare precautie deoarece, in acest caz, efectul comenzii DELETE
este golirea tabelei (stergerea tuturor inregistrarilor din tabela).Astfel, comanda urmatoare goleste
tabela ‘tabel1’:
mysql> DELEETE FROM tabel1;

REZUMAT
Un server de baze de date (in cazul de fata MySQL) este un mediu software care permite stocarea
unei cantitati mari de informatii intr-un formet organizat.

Conectarea clientului la serverul MySQL implica o comanda de genul :


mysql –h hostname –u username –p
Vizualizarea bazelor de date care sunt momentan sub gestiunea serverului:
SHOW DATABASES;
Activitatea unei baze de date:
USE numele_bazei:
Vizualizare tabelelor unei baze de date active:
SHOW TABLES;
Stergerea unei baze de date:
DROP DATABASE numele_bazei;
Stergerea unei tabele:
DROP TABLE numelei_tabelei;
Principalele operatii MySQL asupra datelor unei tabele sunt:
• crearea unei tabele
CREATE TABLE table_name (
column_1_name column_1_type column_1_details,
column_2_name column_2_type column_2_details,…);
• adaugarea intr-o tabela
INSERT iNTO nume_tabela (NUME_coloana1, NUME_coloana2,…)
VALUES (valoare1, valoare2,…);
sau
INSERT iNTO nume_tabela SET
NUME_coloana1=valoare1, NUME_coloana2=valoare2,…;
• vizualizarea datelor dintr-o tabela:
SELECT*/lista_nume_cimpuri FROM tabela [WHERE
conditie];
• modificarea datelor dintr-o tabela:
UPDATE table_name SET col_name=new_value. …Where conditie;
• stergerea datelor dintr-o tabela:
DELETE FROM table_name [WHERE conditie];

Intrebari
Care sunt cele doua componente de baza ale MySQL-ului?

Scrieti o secventa de comenzi MySQL prin care sa creati o tabela cu 3 campuri.


Tabela va fi populata cu trei inregistrari. Modificati apoi ultima inregistrare si stergeti inregistrarea
a doua. Stergeti in final tabela.

Care este comanda pentru golirea unei tabele ?

4. Adminstrarea unui server MySQL

4.1. Comenzile GRANT si REVOKE

Comenzile GRANT si REVOKE (implementate doar incepand cu versiunea MySQL


3.22.11) permit crearea de useri MySQL, respectiv acordarea si revocarea drepturilor pentru acesti
useri, corespunzator la 4 nivele de privilegii [Yan02].
O sintaxa a comenzii GRANT cu cel mai importante clauze (nu toate) este
urmatoarea :
Grant priv_type [(column_list)] [, priv_type
[(column_list)]...]
ON {tbl_name | * | *.* | db_name.*}
TO user_name [IDENTIFIED BY ‘password’]
[, user_name [IDENTIFIED BY ‘password’] …]
[WITH GRANT OPTION]
Cele 4 nivele de privilegii care asigura administrarea drepturilor userilor MySQL sunt:
• Nivelul global:privilegii (drepturi) globale asupra tuturor bazelor de date de pe un server
(MySQL) dat.Aceste privilegii sunt stocate in tabela mysql.user.
Observatie: Prin mysql.user se intelege tabela user din baza de date mysql.De
fapt, acest mod de referire a unei tabele poate fi utilizat chiar in sintaxa comenzilor MySQL (in
special in cazul in care se face referire la o tabela dintr-o baza de date care nu este cea curenta ;
spre exemplu ‘SELECT user, password FROM mysql.user’ va lista informatiile
corespunzatoare listate).
• Nivelul baza de date:privilegii asupra tuturor tabelelor dintr-o anumita baza de date.Aceste
privilegii sunt stocate in tabelele mysql.db si mysql.host.
• Nivelul tabela: privi;egii asupra tuturor coloanelor (campurilor) unei anumite tabele.Aceste
privilegii sunt stocate in tabela mysql.tables_priv.
• Nivelul coloana:privilegii asupra unor coloane dintr-o anumita tabela.Aceste privilegii sunt
stocate in tabela mysql.columns_priv
Acordarea unor drepturi pentru un user care nu exista, conduce implicit la crearea
acelui user.
Sintaxa comenzii REVOKE pentru revocarea unor privilegii este:
REVOKE priv_type [(column_list)] [, priv_type
[(column_list)] …]
ON {tbl_name | * | *.* | db_name.*}
FROM user_name [, user_name …]
Pentru comanda GRANT respective REVOKE, parametrul priv_type poate fi
specificat ca unul di urmatoarea lista:
ALL PRIVILEGES FILE RELOAD
ALTER INDEX SELECT
CREATE INSERT SHUTDOWN
DELETE PROCESS UPDATE
DROP PREFERENCES USAGE

ALL este sinonim cu ALL PRIVILEGES.REFERENCES nu este inca


implementat.USAGE este momentan sinonim cu “fara privilegii”, putand fi utilizat in cazul in care
se doreste crearea unui user fara drepturi.
Pentru revocarea drepturilor unui user, se foloseste pentru priv_type optiunea
GRANT OPTION :REVOKE GRANT OPTION ON...FROM... ;
Optiunile de privilegiu care pot fi utilizate asupra unei tabele sunt
SELECT,INSERT,UPDATE,DELETE,CREATE,DROP,GRANT,INDEX si ALTER.
Optiunile de privilgiu care pot fi utilizate asupra unei coloane (daca se foloseste
oclauza lista de coloane) un SELECT,INSER si UPDATE.
Se pot seta privilegii globale folosind sintaxa ON*.* (semnificand: asupra tuturor
bazelor de date).Se pot seta privilegii pe o baz de date utilizand sintaxa ON db_name.*.Daca se
foloseste clauza ON* si exista o baza curenta, privilegiile vor fi setate pentru acea baza de date
(Atentie, daca NU exista o baza de curenta,operatia poate afecta privilegiile locale!).
Modul de interactiune a privilegiilor de pe cele 4 nivele, pentru un user oarecare,
respecta o conditie logica globala SAU : [privilegii globale] SAU [(privilegii la nivel de baza de
date) SI (privilegii la nivel de host)] SAU [privilegii la nivel de tabela] SAU [privilegii la nivel de
coloana]
In cele mai multe cazuri, se creeaza un user acordandu-se drepturi doar la unul
dintre nivele, asa ca situatia este mai simpla decat pare la prima vedere.
Observatie :In paragrafele urmatoare se va vedea ca totusi, acordarea explicita a unor
privilegii la un anumit nivel, poate avea ca si consecinta primirea implicita a unor drepturi si la alte
nivele.

4.2.Nume de utilizatori MySQL

Pentru a putea acorda drepturi user-ilor de pe diverse host-uri, MySQL permite specificarea
unui user_name sub forma user@host.In cazul in care numele user-ului contine caractere
speciale(‘-‘,’%’, ultimul pe post de caracter wild-card), acesta trebuie incadrat intre ’’(spre
exemplu, ‘user-test’@’host-test’).
Dupa instalarea MySQL, urmatorii useri sunt valizi si implicit creati (fiind stocati in tabela
mysql.user), putand fi vizualizati cu o comanda de genul :
mysql> select user, password, host from mysql.user ;

use password host


r

root localhos
root t
%
localho
st
%
4 rows in set (0.00 sec)
Se poate observa existenta a 4 useri impliciti, fara parole (practic 2 ca nume), cu privilegii
globale.Un user root, atat pentru accesarea de pe host-ul local (localhost), cat si pentru accesul de
la distanta de pe orice alt calculator care are instalat un client MySQL (%), si un user fara nume (de
asemenea pentru accesul de pe host-ul local sau de pe un computer la distanta).
Facand referire la versiunea MySQL 3.23.51 (pentru Windows) pe care au fost rulate toate
exemplificarile facute (dar fara o limitare stricta la acesta versiune), existenta unui user fara nume
permite lansarea in executie a unui client MySQL printr-o simpla lansare a executbilului
mysql.exe.In acest caz, protectia impotriva unor useri neautorizati este practic inexistenta.
Cunoscand numele (sau IP-ul) host-ul pe care este instalat serverul MySQL, oricine se
poate conecta cu drepturi depline, folosind o comanda (lansata din prompter-ul DOS sau cu
optiunea RUN... din meniul sistemului de operare Windows) de forma :
mysql –h IP_adress sau mysql –h nume_calculator (spre exemplu:mysql –h
10.0.27.3 sau mysql –h stargate,stargate fiind numele calculatorului cu IP-ul 10.0.27.3 pe
care este instalat serverul MySQL).
In mod normal, dupa o instalare a server-ului MySQL, acesta va fi pornit automat la orice
pornire a calculatorului gazda.O pornire manuala a serverului, se poate face prin lansarea
programului winmysqladmin.exe.Atat programul de lansare a serverului (sin u numai), cat si
aplicatia client (lansata prin rularea mysql.exe), sunt localizate (implicit) in directorul
c:\mysql\bin.La lansarea pentru prima data a aplicatiei winmysqladmin.exe se poate crea
(printr-un meniu) un alt user diferit de cei implicit existenti.
Asigurarea unei protectii imediat dupa instalarea aplicatiei implica setarea unei parole
pentru userii impliciti.Urmatoarea secventa exemplifica setarea unei parole (lia) pentru userul fara
nume (pentru acces atat de pe host-ul local cat si de la distanta) :
mysql> Update mysql.user SET password=PASSWORD (‘lia’)
->WHERE user=’’ ;

Query OK, 2 rows affected (0.00 sec)


Ws matched: 2 Changed: 2 Warnings: 0

mysql> FLUSH PRIVILEGES;


Query OK, 0 rows affected (0.05 sec)

mysql> SELECT user, password, host FROM mysql.user;


use password host
r
root localhost
root %
79c41d44291539 localhost
57 %
79c41d44291539
57
4 rows in set (0.00 sec)
Observatie.Cu caractere italice s-au marcat mesajele de raspuns ale sistemului la cele
doua comenzi de setare a unei parole : UPDATE, respectiv FLUSH PRIVILEGES (aceasta din
urma fiind oblicatorie pentru ca datele referitoare la privilegii sa fie definitiv validate, evitandu-se
astfel o restartare a serverului).De remarcat modul cum este vizualizata parola criptata in urma unei
comenzi SELECT pe tabela mysql.user.Deci parolele user-ilor stocate in tabelele sistem
MySQL nu apar in clar, ele fiind criptate.
Parola unui user existent se poate seta/modifica si cu o comanda de genul SET
PASSWORD.Spre exemplu:
mysql> SET PASSWORD FOR nelu@localhost=
-> PASSWORD (“newpass”);
Conectarea de la distanta (de pe un alt calculator decat host-ul local) a user-ului fara
nume se face astfel (s-a presupus o anumita adresa de IP):
C:\mysql\bin> mysql –h 10.0.27.3 –u ‘’ –p
Enter password: ***

sau mysql –h 10.0.27.3 –u ‘’ –plia (fara spatiu intre –p si parola propriu-zisa, aceasta metoda
fiind mai putin recomandata deoarece, dupa cum se observa fata de cazul precedent, parola apare in
clar).
Aceleasi operatii trebuie efectuate si pentru superuser-ul root.

4.3.Crearea de utilizatori (useri)

Crearea de noi utilizatori MySQL se poate realiza fie utilizand comanda GRANT, fie
prin manipularea directa a continutului tabelelelor bazei de date dedicate administrarii (mysql.db).
Prima metoda este preferata, datorita faptului ca este mai concisa si reduce riscul
aparitiei unor erori de administrare.
Sa incercam crearea unor alti useri, cu diverse drepturi.Pentru toti noii utilizatori creati
in exemplele urmatoare, se presupune ca userul client curent (cel care creeaza noii useri) este userul
root, cu toate drepturile posibile.
Crearea unui user nou (nelu), cu toate privilegiile globale, cu o parola, se poate realiza
cu o comanda de genul :

mysql> GRANT all privileges ON *.* TO nelu@localhost


-> IDENTIFIED by ‘password’ WITH GRANT OPTION;

Optiunea WITH GRANT OPTION permite user-ului astfel creat sa creeeze la randul
lui un user cu toate drepturile de care el dispune.
Vizualizarea catorva din privilegii pentru userii existenti se poate face astfel :

mysql> SELECT user, host, select_priv, insert_priv,


-> delete_priv from user;

user host select_pr insert_pri delete_pri


iv v v
root localhos Y Y Y
t N N N
% Y Y Y
root localho Y Y Y
nel st Y Y Y
u %
localho
st

5 rows in set (0.00 sec)

Comanda anterioara arata ca userul nou, astfel creat, primeste toate privilegiile.
Stergerea unor privilegii pentru user-ul existent se poate face cu o comanda de genul:

mysql> REVOKE insert, delete on *.* from nelu@localhost;

iar ca rezultat al executiei comenzii, se poate observa comparativ modificarea realizata in tabela
user:

mysql> select user, host, select_priv, insert_priv,


-> delete_priv from user;
use host select_pr insert_pri delete_pri
r iv v v
root localhost Y Y Y
% N N N
localhost Y Y Y
root % Y Y Y
nel localhost Y N N
u
5 rows in set (0.05 sec)

De remarcat ca, userul fara nume, implicit creat la instalare pentru alti clienti decat cei
de pe host-ul local (inregistrarea 2 din tabelul anterior afisat), nu are nici un privilegiu, lucru
explicabil din motive de securitate.
Alte cateva exemple de creare a unor noi useri:

mysql> GRANT ALL PRIVILEGES ON *.* TO nelu@”%”


-> IDENTIFIED BY ‘alt_password’ WITH GRANT OPTION;
mysql> GRANT USAGE ON *.* TO adi@localhost
-> IDENTIFIED BY ‘ADI’;

In primul caz, s-a creat un user cu acelasi nume ‘nelu’, dar cu o alta parola, caruia ii
este permisa conectarea doar de pe un host client la distanta.Evident ca se putea prevede o aceeasi
parola ca si pentru user-ul ‘nelu’, creat pentru acces doar de pe localhost.De remarcat totusi ca, cei
doi utilizatori cu numele ‘nelu’, sunt pana la urma doi useri distincti.Cu alte cuvinte, daca “unui
acelasi” utilizator (avand acelasi nume de user si password) se doreste a I se aloca drepturi, atat
pentru accesul local cat si de la distanta, sunt necesare doua comenzi GRANT (de fapt creandu-se
pana la urma doi useri distincti, lucru observabil si din punct de vedere al numarului de articole-
doua- din tabela de administrare).
Crearea unui astfel de ‘super-user’ nu prea este necesara, doar userul pe post de
administrator MySQL (implicit, “root”) avand toate drepturile asupra resurselor
serverului.Acordarea unui numar excesiv de drepturi unui utilizator novice sau care nu are nevoie
de aceste drepturi, poate conduce la o insecuritate a informatiei memorate in bazele de date (atat
cele de lucru, cat si in cea de administrare)
In al doilea caz este creat un user (‘adi’, cu parola ‘adi’), si care are toate drepturile
setate pe ‘N’, clauza USAGE permitand crearea unui user fara nici un drept, doar cel de conectare
la server.Se presupune ca, unui astfel de user, i se vor acorda mai tarziu drepturi specifice asupra
unei anumite baze de date.
Observatie : Un astfel de user nu poate crea/sterge/accesa o baza de date, dar poate vedea numele
bazelor de date de pe server si are drepturi in baza de date ‘test’, implicit creata la instalare.
Aceeasi useri se puteau crea si folosind comanda INSERT asupra tabelei mysql.user
si comandand apoi serverului sa reincarce tabelele cu privilegii :
mysql> INSERT INTO mysql.user
-> VALUES (‘localhost’, ‘nelu’, PASSWORD (‘password’),
-> ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’,
-> ‘Y’, ‘Y’);
mysql> INSERT INTO mysql.user
-> VALUES (‘%’, ‘nelu’, PASSWORD (‘alt_password’),
-> ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’, ‘Y’,
-> ‘Y’, ‘Y’);
mysql> INSERT INTO mysql.user (Host, User, Password)
-> VALUES (‘localhost’, ‘adi’, ‘adi’);

mysql> FLUSH PRIVILEGES;

Functie de versiunea serverului MySQL, numarul de valori ‘Y’ poate sa difere


(anterior versiunii 3.22.11, numarul de coloane alocate privilegiilor este mai mic).
De remarcat faptul ca, pentru a crea un’super-user’, este suficienta adaugarea unei noi
inregistrari in tabela mysql.user, cu toate campurile alocate privilegiilor setate pe valoarea ‘Y’, fara
a fi necesara nici o interventie in celelalte tabele de administrare.In urma unei operatii de creare a
unui user, pentru care nu se specifica valori explicite alocate coloanelor de privilegii din tabela
mysql.user, valoarea implicita preluata pentru acestea este ‘N’.
Urmatorul exemplu prezinta crearea unui user ‘cristi’, care se poate conecta la
serverul MySQL, atat de pe localhost, cat si de pe unul din domeniile aut.utt.ro, respectiv
cs.utt.ro.La conectarea de pe localhost are acces la baza de date baza_1, la conectarea de pe
domeniu aut.utt.ro accesul este doar la baza de date baza_2, iar la o baza baza_3 are acces de pe
ambele domenii cs.utt.ro, respectiv aut.utt.ro.Parola, indiferent de domeniul de conectare, va fi
‘secret’.Pentru a crea un user cu aceste privilegii, folosind comanda GRANT, urmatoarea
secventa trebuie executata :
mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP
-> ON baza_1.* TO cristi@localhost IDENTIFIED BY ‘secret’;

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP


-> ON baza_2.* TO cristi@aut.utt.ro IDENTIFIED BY
-> ‘secret’;

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP


-> ON baza_3.* TO cristi@’%.utt.ro’ IDENTIFIED BY
-> ‘secret’;

Sa urmarim ce se intampla dupa prima comanda din cele anterioare:

mysql> GRANT SELECT,INSERT, UPDATE, DELETE, CREATE, DROP


-> ON baza_1.* TO cristi@localhost
-> IDENTIFIED BY ‘secret’;

mysql> select user, password, host, select_priv,


->shutdown_priv from mysql.user;

user password host select_priv shutdown_priv


root localhost Y Y
root % Y Y
localhost Y Y
% N N
cristi 428567f4089944 localhost N N
adi 04 localhost N N
5820800e28e81d8
3
6 rows in set (0.01 sec)

Se poate observa ca, pentru userul nou creat (cristi),in tabela de privilegii
mysql.user este creata o noua inregistrare, dar nici un privilegiu nu este setat
afirmativ.Aceasta noua inregistrare permite doar o conectare la serverul MySQL.

mysql> select host , db , user , select_priv , insert_priv ,


-> grant_priv from mysql.db;

host db user select_priv insert_priv grant_priv


% test% Y Y N
localhost baza_1 cristi Y Y N
2 rows in set (o.oo sec)
In tabela mysql.db in schimb, pentru userul cristi , legat de baza de date baza_1, sunt
acordate doar drepturile prevazute in comanda GRANT (se poate observa ca anumite privilegii nu
au fost acordate).
Iata cum arata o parte din tabela de administrare mysql.db dupa executia si a ultimei din cele
trei comenzi ale secventei initiale :

mysql> select host, db, user, select_priv, insert_priv,


-> grant_priv from mysql.db;
host db user select_priv insert_priv grant_priv
% test% Y Y N
localhost baza_1 cristi Y Y N
aut.utt.ro baza_2 cristi Y Y N
%.utt.ro baza_3 cristi Y Y N
4 rows in set (0.01 sec)

S-au prezentat aceste vizualizari, pentru a arata ca, acordarea de drepturi pe o anumita baza
de date unui user nou creat, conduce la afectarea atat a tabelei user cat si db din baza de date
mysql.
Evident ca se puteau crea acesti useri(pentru ca, pana la urma, sunt practic trei useri) folosind
o serie de comenzi INSERT asupra celor doua tabele, urmate de o comanda FLUSH
PRIVILEGES.
Observatie : Bazele de date asupra carora li se acorda unor useri drepturi pot sa fie create ulterior
crearii acelor useri.