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),

Baze-de-Date-Relation-Ale-Mysql

Embed Size (px)

DESCRIPTION

Baze-de-Date-Relation-Ale-Mysql

Citation preview

Page 1: Baze-de-Date-Relation-Ale-Mysql

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),

Page 2: Baze-de-Date-Relation-Ale-Mysql

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 -punde:

- 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:

Page 3: Baze-de-Date-Relation-Ale-Mysql

Databasemysql

test2 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 \cmysql>

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> quitBye

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 ;

Page 4: Baze-de-Date-Relation-Ale-Mysql

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’

Page 5: Baze-de-Date-Relation-Ale-Mysql

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 nume data

int (11) text date

YES PRI 0

NULL 0000-00-00

auto_inc

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,-> … -> ;

Page 6: Baze-de-Date-Relation-Ale-Mysql

Spre exemplu, urmatoarele doua comenzi sunt echivalente: mysql> INSERT INTO TABEL1 SET nume=’Dan’, data=’2002-05-2 saumysql> 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 2

ION DAN

2002-04-25 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_DATEreturneaza data curenta : CURRENT_DATE 2002-06-10

1 row in set (0.00 sec)De asemenea, comanda:

Page 7: Baze-de-Date-Relation-Ale-Mysql

mysql> SELECT YEAR (CURRENT_DATE);returneaza anul corespunzator datei curente: year (current_date) 2002

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: id

nume

left (nume,2)

1 2 3

ION DAN IOAN

IO DA 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’: nume ION IOAN

Page 8: Baze-de-Date-Relation-Ale-Mysql

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: id

nume

1 3

ION 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: 0O 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).

Page 9: Baze-de-Date-Relation-Ale-Mysql

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 –pVizualizarea 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 tabeleCREATE 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,…)

Page 10: Baze-de-Date-Relation-Ale-Mysql

VALUES (valoare1, valoare2,…);sau INSERT iNTO nume_tabela SETNUME_coloana1=valoare1, NUME_coloana2=valoare2,…;

• vizualizarea datelor dintr-o tabela:SELECT*/lista_nume_cimpuri FROM tabela [WHEREconditie];

• 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:

Page 11: Baze-de-Date-Relation-Ale-Mysql

• 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 RELOADALTER INDEX SELECTCREATE INSERT SHUTDOWNDELETE PROCESS UPDATEDROP 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

Page 12: Baze-de-Date-Relation-Ale-Mysql

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 [email protected] 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 ;

user

password host

root root

localhost % localhost %

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 :

Page 13: Baze-de-Date-Relation-Ale-Mysql

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; user

password host

root root

79c41d4429153957 79c41d4429153957

localhost % localhost %

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”);

Page 14: Baze-de-Date-Relation-Ale-Mysql

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 ‘’ –pEnter 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

iv insert_priv

delete_priv

root

root nelu

localhost % localhost %

Y N Y Y Y

Y N Y Y Y

Y N Y Y Y

Page 15: Baze-de-Date-Relation-Ale-Mysql

localhost

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; user

host select_priv

insert_priv

delete_priv

root

root nelu

localhost % localhost % localhost

Y N Y Y Y

Y N Y Y N

Y N Y Y N

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

Page 16: Baze-de-Date-Relation-Ale-Mysql

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

Page 17: Baze-de-Date-Relation-Ale-Mysql

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

mysql> GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP-> ON baza_2.* TO [email protected] 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_privrootroot

cristiadi

428567f4089944045820800e28e81d83

localhost%localhost%localhostlocalhost

YYYNNN

YYYNNN

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%localhost

test%baza_1 cristi

YY

YY

NN

2 rows in set (o.oo sec)

Page 18: Baze-de-Date-Relation-Ale-Mysql

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%localhostaut.utt.ro%.utt.ro

test%baza_1baza_2baza_3

cristicristicristi

YYYY

YYYY

NNNN

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.