{"id":61,"date":"2025-01-29T18:50:48","date_gmt":"2025-01-29T18:50:48","guid":{"rendered":"https:\/\/eugo.ro\/?p=61"},"modified":"2025-02-15T15:36:48","modified_gmt":"2025-02-15T13:36:48","slug":"make-a-oracle-database","status":"publish","type":"post","link":"https:\/\/eugo.ro\/?p=61","title":{"rendered":"Crearea unei baze de date Oracle &#8211; Make a Oracle DataBase"},"content":{"rendered":"<div class=\"mainbar\">\n<div class=\"article\">\n<div>\n<h3>Conceptele Bazelor de Date Rela\u0163ionale<\/h3>\n<\/div>\n<\/div>\n<div class=\"mainbar\">\n<div class=\"article\">\n<div>\n<h3>Definirea bazei de date<\/h3>\n<p>Prin intermediul calculatoarelor electronice se pot realiza activit\u0103\u0163i precum stocare, interogare \u015fi administrare de colec\u0163ii de date. Prin intermediul tehnologiilor informa\u0163ionale se pot definii tehnici \u015fi metode de oraganizare a colec\u0163iilor de date. Organizarea \u00een fi\u015fiere de date \u015fi organizarea \u00een baze de date sunt dou\u0103 din metodele cunoscute. Prin anii 1960 se folosea organizarea datelor \u00een fi\u015fiere de date, dar aceast\u0103 metod\u0103 are \u015fi unele neajunsuri \u015fi limit\u0103ri din care se poate men\u0163iona urmatoarele:<\/p>\n<p>Datele sunt dependente de program, deci trebuie s\u0103 se fac\u0103 descrierea datelor \u00een fiecare program \u00een care sunt utilizate<br \/>\nExist\u0103 redundan\u0163e ridicate \u00een cadrul colec\u0163iilor de date<br \/>\nPerforman\u0163e sc\u0103zute \u00een procesarea datelor<br \/>\nPentru a se limita aceste neajunsuri \u015fi limit\u0103ri ale datelor organizate \u00een fi\u015fiere de date au fost dezvoltate alte metode de organizare a datelor \u015fi anume organizarea datelor \u00een baze de date.<\/p>\n<p>Defini\u0163ie: O baz\u0103 de date este o colec\u021bie de informa\u021bii care este organizat\u0103 \u00een a\u0219a fel \u00eenc\u00e2t s\u0103 poat\u0103 fi u\u0219or de accesat, gestionat \u0219i actualizat.<\/p>\n<p>Diferen\u0163a \u00eentre metoda de organizare a datelor \u00een fi\u015fiere de date \u015fi cea de organizare a datelor \u00een baze de date este c\u0103 \u00een cea din urm\u0103 (organizarea datelor \u00een baze de date) exiat\u0103 un fi\u015fier de descriere general\u0103 a bazei, iar \u00een acest fel se poate realiza independen\u0163a programelor fa\u0163\u0103 de date. Acest fi\u015fier care face o descriere general\u0103 (global\u0103) a bazei se nume\u015fte dic\u0163ionar de date. Ca atare modificarea datelor sau extragerea acestora se face prin intermediul acestui dic\u0163ionar de date \u00een care g\u0103sim informa\u0163ii referitoare la structura datelor.<\/p>\n<p>De multe ori termenul de \u201cbaz\u0103 de date\u201d este \u00een\u0163eles \u015fi utilizat gre\u015fit \u015fi se confund\u0103 cu softul de baze de date care se utilizeaz\u0103. De fapt softul pentru baze de date se nume\u015fte sistem de gestiune al bazelor de date (SGBD), iar baza de date este containierul (daca putem sa facem o analogie ca s\u0103 \u00eentelegem mai bine diferenta dintre o baz\u0103 de date \u015fi un SGBD) care con\u0163ine informa\u0163iile, iar acest containier este creat \u015fi gestionat prin intermediul SGBD. Nu orice colec\u0163ie de date este o baz\u0103 de date. Proiectarea unei baze de date \u00eenseamna s\u0103 \u00eei stabilim structura, caracteristicile, elementele componente acesteia, precum \u015fi restric\u0163iile care trebuie respectate \u015fi rela\u0163iile dintre ele.<\/p>\n<p>A construi o baz\u0103 de date \u00eenseamn\u0103 s\u0103 introducem datele noastre \u00een baza de date dupa ce am proiectat-o. A administra o baz\u0103 de date \u00eenseamn\u0103 s\u0103 asigur\u0103m accesul utilizatorilor la date \u00een func\u0163ie de drepturile pe care le-am acordat fiecaruia. A interoga o baz\u0103 de date \u00eenseamn\u0103 a extrage \u015fi vizualiza acele date care \u00eendeplinesc anumite condi\u0163ii dupa care am facut c\u0103utarea. Dup\u0103 cum spuneam nu orice colec\u0163ie de date este o baz\u0103 de date, de exemplu lista filmelor unui magazin care are ca activitate \u00eenchirierea de filme clien\u0163ilor nu este o baz\u0103 de date, ci este doar un simplu tabel sau o list\u0103. Deci o baz\u0103 de date difer\u0103 de un simplu tabel \u015fi trebuie s\u0103 aib\u0103 anumite propriet\u0103\u0163i cum ar fi:<\/p>\n<p>Este o colec\u0163ie de date coerent\u0103 din punct de vedere al logicii<br \/>\nEste proiectat\u0103, construit\u0103 \u015fi administrat\u0103 av\u00e2nd un scop bine determinat<br \/>\nReprezint\u0103 anumite aspecte ale lumii reale<br \/>\nO baz\u0103 de date poate fi \u00een\u0163eleas\u0103 ca o colec\u0163ie de fi\u015fiere asociate. Modul \u00een care aceste fi\u015fiere sunt asociate depinde de modelul utilizat. Primele modele au inclus modelul ierarhic (caz \u00een care fi\u015fierele sunt asociate \u00eentr-un mod p\u0103rinte \/ copil, cu fiecare fi\u015fier copil av\u00e2nd cel mult un fi\u015fier p\u0103rinte), precum \u015fi modelul de re\u0163ea ( caz \u00een care fisierele sunt asociate ca proprietari \u015fi membrii, similar cu modelul de re\u0163ea, cu excep\u0163ia c\u0103 fiecare fi\u015fier membru poate avea mai mult de un proprietar).<\/p>\n<p>S\u0103 lu\u0103m exemplu urm\u0103toarele dou\u0103 tabele:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/tabelul_autori.png\" alt=\"\" width=\"586\" height=\"157\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/tabel_lucrari.png\" alt=\"\" width=\"399\" height=\"156\" \/><\/p>\n<p>Aceste dou\u0103 tabele sunt legate printr-o rela\u0163ie de referin\u0163\u0103, c\u00e2mpul \u201eCOD\u201d din tabelul <strong>\u201eAutori\u201d<\/strong> \u015fi c\u00e2mpul \u201eAUTOR\u201d din tabelul <strong>\u201eLucr\u0103ri\u201d<\/strong>. Putem vedea cine a scris lucrarea \u201eLinux pentru \u00eencepatori\u201d urm\u00e2nd rela\u0163ia de referint\u0103, din care reiese c\u0103 autorul este \u201e2\u201d din tabelul <strong>\u201eLucr\u0103ri\u201d<\/strong> adic\u0103 Dumitru George din tabelul <strong>\u201eAutori\u201d<\/strong>.<\/p>\n<p>O baz\u0103 de date rela\u0163ional\u0103 este un sistem \u00een care datele sunt stocate \u00een tabele de r\u00e2nduri (\u00eenregistr\u0103ri) \u015fi coloane (c\u00e2mpuri). Caracteristica definitorie a unei baze de date rela\u0163ional\u0103 este faptul c\u0103 un set complet de date este divizat \u00een mai multe tabele (fiecare reprezent\u00e2nd un singur subiect) \u015fi rela\u0163iile pot fi stabilite \u00eentre aceste tabele prin utilizarea de domenii cheie.<\/p>\n<p>Structured Query Language (SQL) este folosit \u00eentr-un SGBD pentru a manipula datele din tabele. Exist\u0103 mai multe pachete software de SGBD pe care putem s\u0103 le alegem. \u00cen domeniul comercial, Oracle a fost mult timp cel mai popular SGBD, urmat de IBM DB2 \u015fi Microsoft SQL Server. \u00cen domeniul open-source, MySQL \u015fi PostgreSQL sunt cele mai importante SGBD. Microsoft Access este un pachet relativ ieftin, care este cel mai potrivit pentru seturi mici de date.<\/p>\n<p>\u00cen 1970, atunci c\u00e2nd E.F. Codd a dezvoltat modelul, acesta a fost considerat a fi nepractic, deoarece ma\u015finile din acea perioad\u0103 nu puteau face fa\u0163\u0103 cerin\u0163elor hardware necesare. Desigur, de atunci hardware-ul a f\u0103cut progrese uria\u015fe, astfel \u00eenc\u00e2t ast\u0103zi chiar \u015fi cele mai modeste PC-uri pot rula sisteme sofisticate de SGBD. Odat\u0103 cu aceasta a fost dezvoltat \u015fi limbajul SQL. SQL este relativ usor de \u00eenv\u0103\u0163at \u015fi permite oamenilor s\u0103 \u00eenve\u0163e rapid cum s\u0103 efectueze interog\u0103ri pe o baz\u0103 de date rela\u0163ional\u0103.<\/p>\n<p>O \u00een\u0163elegere a bazelor de date rela\u0163ionale necesit\u0103 o \u00een\u0163elegere a unora dintre termenii de baz\u0103. Datele sunt valorile stocate \u00een baza de date. Ca atare, datele \u00eenseamn\u0103 foarte pu\u0163in. &#8220;12345&#8221; este un exemplu Informa\u0163iile sunt date care sunt prelucrate pentru a avea un sens. De exemplu, &#8220;637500&#8221;, este popula\u0163ia ora\u015fului Brasov.<\/p>\n<p>O baz\u0103 de date este o colec\u0163ie de tabele. Fiecare tabel con\u0163ine \u00eenregistr\u0103ri, care sunt r\u00e2ndurile orizontale din tabel. Acestea sunt, de asemenea, numite tupluri. Fiecare \u00eenregistrare con\u0163ine c\u00e2mpuri, care sunt coloanele verticale ale tabelului. Acestea sunt, de asemenea, numite atribute. C\u00e2mpurile pot fi de mai multe tipuri diferite. Exist\u0103 mai multe tipuri de date standard, iar fiecare SGBD (sistem de management de baze de date, cum ar fi Oracle sau MySQL) au de asemenea, propriile tipuri specifice de date, dar \u00een general, acestea se \u00eencadreaz\u0103 \u00een cel pu\u0163in trei tipuri, caracter, numeric \u015fi data.<br \/>\nDomeniul se refer\u0103 la valorile posibile pentru fiecare c\u00e2mp. De exemplu, un c\u00e2mp denumit &#8220;gen&#8221; poate fi limitat la valorile &#8220;masculin&#8221; si &#8220;feminin&#8221;.<\/p>\n<p>Un c\u00e2mp con\u0163ine o valoare \u201eNULL\u201d atunci c\u00e2nd c\u00e2mpul nu con\u0163ine nimic, adica o valoare necunoscut\u0103 de exemplu. C\u00e2mpurile pot crea complexit\u0103\u0163i \u00een calcule \u015fi au consecin\u0163e pentru exactitatea datelor. Din acest motiv, multe c\u00e2mpuri sunt \u00een mod special setate s\u0103 nu con\u0163in\u0103 valori \u201eNULL\u201d.<\/p>\n<p>O cheie este o modalitate logic\u0103 de a accesa o \u00eenregistrare \u00eentr-un tabel. De exemplu, \u00eentr-un tabel numit \u201eAUTOR\u0130\u201d, c\u00e2mpul \u201eCOD\u201d ar putea s\u0103 ne permit\u0103 s\u0103 identific\u0103m unic o \u00eenregistrare. O cheie care identific\u0103 \u00een mod unic o \u00eenregistrare se nume\u015fte cheie primar\u0103.<\/p>\n<p>Un index este un mecanism fizic care \u00eembun\u0103t\u0103\u0163este performan\u0163a unei baze de date. Indexurile sunt adesea confundate cu chei. Cu toate acestea, strict vorbind ei sunt parte a structurii fizice, \u00een timp ce cheile sunt parte a structurii logice. O vizualizare este un tabel virtual alc\u0103tuit dintr-un subset de tabele reale (concrete).<br \/>\nO rela\u0163ie unu-la-unu (1:1) \u00een cazul \u00een care are loc rela\u0163ia, pentru fiecare instan\u0163\u0103 a tabelului A, numai o instan\u0163\u0103 din tabelul B exist\u0103, si vice-versa.<\/p>\n<p>O rela\u0163ie <strong>unu-la-mai-mul\u0163i (1: m)<\/strong> \u00een cazul \u00een care rela\u0163ia exist\u0103, pentru fiecare instan\u0163\u0103 a tabelului A, mai multe instan\u0163e a tabelului B exist\u0103, dar pentru fiecare instan\u0163\u0103 din tabelul B, numai o singur\u0103 instan\u0163\u0103 a tabelului A exist\u0103.<\/p>\n<p>O rela\u0163ie <strong>mul\u0163i pentru mul\u0163i (m: n)<\/strong> \u00een cazul \u00een care are loc rela\u0163ia, pentru fiecare instan\u0163\u0103 a tabelului A, exist\u0103 mai multe instante a tabelului B, iar pentru fiecare instan\u0163\u0103 a tabelului B, exist\u0103 mai multe instante ale tabelului A.<\/p>\n<p>O rela\u0163ie este op\u0163ional\u0103 \u00een cazul \u00een care, pentru fiecare instan\u0163\u0103 a tabelului A, pot exista instan\u0163e ale tabelului B<\/p>\n<p>\u0130ntegritatea datelor descrie acurate\u0163ea, validitatea \u015fi coeren\u0163a datelor. Un exemplu de integritate slab\u0103 ar fi \u00een cazul \u00een care numele unui autor este stocat \u00een mod diferit \u00een dou\u0103 locuri diferite.<\/p>\n<p>Normalizarea bazei de date este o tehnic\u0103 care ne ajut\u0103 la reducerea apari\u0163iei anomaliilor de date \u015fi slaba integritate a datelor.<\/p>\n<p>Modelul rela\u0163ional const\u0103 din urm\u0103toarele:<\/p>\n<p>O colec\u0163ie de obiecte sau rela\u0163ii<br \/>\nUn set de operatori care ac\u0163ioneaz\u0103 asupra rela\u0163iilor<br \/>\n\u0130ntegritate a datelor pentru acurate\u0163e \u015fi consecven\u0163\u0103<br \/>\nComponente ale modelului rela\u0163ional:<br \/>\nColec\u0163ii de obiecte sau rela\u0163ii care stocheaz\u0103 datele<br \/>\nUn set de operatori care pot ac\u0163iona asupra rela\u0163iilor pentru a produce alte rela\u0163ii<br \/>\n\u0130ntegritatea datelor pentru acurate\u0163e \u015fi consecven\u0163\u0103O baz\u0103 de date rela\u0163ional\u0103 este o colec\u0163ie de rela\u0163ii sau tabele bidimensionale utilizate pentru a stoca informa\u0163ii.<\/p>\n<p>De exemplu, putem avea nevoie s\u0103 stocam informa\u0163ii despre to\u0163i angaja\u0163ii dintr-o anumit\u0103 companie. \u00centr-o baz\u0103 de date rela\u0163ional\u0103, putem crea mai multe tabele pentru a stoca diferite buc\u0103\u0163i de informa\u0163ii despre angaja\u0163i cum ar fi un tabel cu to\u0163i angaja\u0163ii, un tabel cu angaja\u0163ii dintr-un anumit departament precum \u015fi un tabel cu salariul fiecarui angajat dintr-un anumit departament.<\/p>\n<p>Propriet\u0103\u0163ile bazelor de date rela\u0163ionale.<\/p>\n<p>O baz\u0103 de date relational\u0103:<br \/>\nPoate fi accesat\u0103 \u015fi modificat\u0103 execut\u00e2nd instruc\u0163iuni ale limbajului Structured Query Language (SQL)<br \/>\nCon\u0163ine o colec\u0163ie de tabele f\u0103r\u0103 indicii fizice<br \/>\nUtilizeaz\u0103 un set de operatori\u00cen baza de date rela\u0163ional\u0103, nu e necesar s\u0103 specific\u0103m calea de acces la tabele, nici nu trebuie s\u0103 \u015ftim modul \u00een care datele sunt aranjate fizic. Pentru a accesa baza de date, executam pur \u015fi simplu o interogare a limbajului SQL, care este conform American National Standard Institute (ANSI) limbajul standard pentru baze de date rela\u0163ionale. Limbajul con\u0163ine un set larg de operatori pentru parti\u0163ionare \u015fi combinarea rela\u0163iilor. Bazele de date pot fi modificate cu ajutorul declara\u0163iilor SQL.<\/p>\n<p>Limbajul de interogare structurat SQL ne permite s\u0103 comunic\u0103m cu serverul \u015fi are urmatoarele avantaje:<\/p>\n<p>Eficien\u0163\u0103<br \/>\nU\u015for de \u00eenv\u0103\u0163at \u015fi folosit<br \/>\nFunc\u0163ionalitate complet\u0103 (SQL ne permite s\u0103 definim, reg\u0103sim \u015fi s\u0103 manipul\u0103m datele \u00een tabele)<strong>Entitate<\/strong><\/p>\n<p>O entitate poate s\u0103 fie un obiect din lumea \u00eenconjur\u0103toare care are o existen\u0163\u0103 fizic\u0103, sau mai poate fi un obiect care are o existen\u0163\u0103 abstract\u0103, conceptual\u0103. O entitate poate s\u0103 fie dependent\u0103 (slab\u0103) \u015fi \u00een acest caz depinde de alte entit\u0103\u0163i, sau independent\u0103 adic\u0103 (tare) \u015fi atunci nu mai depinde de alte entit\u0103\u0163i.<\/p>\n<p>Observatii:<br \/>\nEntita\u0163ile sunt tabele \u00een modelele de date rela\u0163ionale<br \/>\nEntita\u0163ile se scriu cu litere mari<br \/>\nSunt substantive, dar nu orice substantiv este o entitate<br \/>\nPrin intermediul cheii primare identificam unic o entitate,cheia primar\u0103 trebuie s\u0103 fie unic\u0103<br \/>\nEste nevoie de o descriere detaliat\u0103 a fiecarei entita\u0163i<br \/>\nNu putem avea doua entita\u0163i cu acela\u015fi nume \u00eentr-o diagram\u0103, sau s\u0103 avem nume diferite pentru aceea\u015fi entitate<strong>Relatie<\/strong><\/p>\n<p>C\u00e2nd proiectam o baz\u0103 de date, model\u0103m un sistem care exist\u0103 \u00een lumea real\u0103, acesta descrie mai multe entit\u0103\u021bi care au anumite caracteristici, sau atribute \u0219i de asemenea exist\u0103 anumite reguli \u015fi leg\u0103turi \u00eentre aceste entit\u0103\u021bi. O rela\u021bie descrie modul \u00een care entit\u0103\u021bile sunt legate una de alta. Rela\u021biile pot fi considerate verbe care leag\u0103 dou\u0103 sau mai multe substantive.<\/p>\n<div>Exist\u0103 trei tipuri de rela\u021bii \u00eentre entit\u0103\u021biile dintr-o baz\u0103 de date:<\/div>\n<p><strong>Rela\u021bii unu-la-unu<\/strong>: \u00cen acest tip de rela\u021bie, fiecare instan\u021b\u0103 a unei entit\u0103\u021bi se refer\u0103 la o singur\u0103 instan\u021b\u0103 a unei alte entit\u0103\u021bi. Deci, exist\u0103 un raport de unu-la-unu one-to-one (1:1).<br \/>\n<strong>Rela\u021bii unu-la-mai-mul\u021bi<\/strong>: \u00cen acest tip de rela\u021bie, fiecare instan\u021b\u0103 a unei entit\u0103\u021bi se refer\u0103 la una sau mai multe instan\u021be ale unei alte entit\u0103\u021bi. De exemplu, un autor ar fi scris mai multe c\u0103r\u021bi, dar anumite c\u0103r\u021bi au un singur autor. Acesta este cel mai comun tip de rela\u021bie modelat \u00een baze de date rela\u021bionale one-to-many (1:n).<br \/>\nRela\u021bii <strong>mul\u021bi-la-mai-mul\u021bi<\/strong>: \u00cen acest tip de rela\u021bie, mai multe instan\u021be ale unei anumite entita\u0163i se refer\u0103 la una sau mai multe instan\u021be ale unei alte entit\u0103\u021bi. De exemplu, co-autorii ar putea scrie o serie de c\u0103r\u021bi many-to-many (m:n).<br \/>\nObservatii:<br \/>\n\u00cen modelul rela\u0163ional, rela\u0163iile devin tabele speciale sau coloane care refer\u0103 chei primare.<br \/>\nSe face o descriere pentru fiecare rela\u0163ie.<br \/>\nPutem avea rela\u0163ii diferite cu acela\u015fi nume \u00een aceea\u015fi diagram\u0103, dar \u00een acest caz, acestea sunt diferen\u0163iate de entit\u0103\u0163ile care sunt asociate prin rela\u0163ia respectiv\u0103<br \/>\nTrebuie s\u0103 stabilim cardinalitatea pentru fiecare rela\u0163ie (maxim\u0103 \u015fi minim\u0103), adic\u0103 num\u0103rul de \u00eenregistrari ce apar\u0163in rela\u0163iei.<strong>Atributul<\/strong><\/p>\n<p>Este o proprietate care descrie o rela\u0163ie sau o entitate. De exemplu numele unui film este atribut al entit\u0103\u0163ii FILM_STOC, iar pre\u0163ul de \u00eenchiriere a unui film este un atribut al rela\u0163iei \u201c\u00eenchiriaz\u0103\u201d ce leaga entita\u0163ile FILM_STOC \u015fi FILME_INCHIRIATE.<\/p>\n<p>Atributele pot s\u0103 fie simple (ex. pretul cu care este \u00eenchiriat un film), compuse (ex. mai multe nr. de telefon a persoanei care a \u00eenchiriat un film), sau derivate (ex. anul na\u015fterii unei persoane care se ob\u0163ine sc\u0103z\u00e2nd din anul curent v\u00e2rsta persoanei respective).<\/p>\n<div>Observatii<\/div>\n<p>Trebuie totu\u015fi s\u0103 facem diferen\u0163a \u00eentre un atribut care poate s\u0103 devin\u0103 coloan\u0103 \u00eentr-un model rela\u0163ional \u015fi valoarea acestuia care este o valoare \u00een coloan\u0103. Fiecarui atribut este necesar s\u0103 \u00eei atribuim o descriere, iar pentru fiecare atribut trebuie s\u0103 specificam numele, tipul de date ( integer, float, char, etc) valori posibile pe care le poate lua, valori implicite, constr\u00e2ngeri, tipuri compuse, reguli de validare.<\/p>\n<p><strong>Diagrama E\/R \u2013 Cardinalitate<\/strong><\/p>\n<p>Defini\u0163ie: Se numeste rela\u0163ie \u00eentre entita\u0163ile E1, E2,\u2026Ek orice submultime a produsului cartezian al mul\u0163imilor elementelor celor k entita\u0163i, adica mul\u0163imi de elemente de forma (e1, e2,\u2026,ek) unde &#8220;ei&#8221; este un element din &#8220;Ei&#8221;, oricare ar fi i = 1,\u2026,k.<\/p>\n<p>Prin intermediul diagramelor entitate rela\u0163ie este reprezentat grafic modelul logic al unei baze de date. Diagrama este utilizat\u0103 des pentru a reprezenta grafic modelul rela\u0163ional. Dup\u0103 cum \u00eei spune \u015fi numele, modelul E\/R se ocupa de entita\u0163i, proprieta\u0163iile sau atributele ce definesc anumite laturi ale entita\u0163ilor \u015fi legaturile dintre entita\u0163i.<\/p>\n<div>Etapele realizarii diagramei E\/R<\/div>\n<p>Identificam entita\u0163ile<br \/>\nIdentificam rela\u0163ile dintre entita\u0163i<br \/>\nStabilim cardinalit\u0103\u0163ile<br \/>\nIdentificam atributele pentru fiecare entitate<br \/>\nStabilim cheiele<strong>Forme normale<\/strong><\/p>\n<div>Definitie: \u201eNormalizarea este procesul de organizare a datelor \u00een mod eficient \u00eentr-o baz\u0103 de date \u015fi are dou\u0103 scopuri, s\u0103 elimine datele redundante \u015fi s\u0103 asigure dependen\u0163a datelor d\u00e2ndu-le un sens.\u201d<\/div>\n<p>Avantajele normalizarii sunt:<br \/>\nMai pu\u0163in spa\u0163iu de stocare<br \/>\nActualiz\u0103ri mai rapide<br \/>\nMai pu\u0163in\u0103 neconcordan\u0163\u0103 a datelor<br \/>\nRela\u0163ii clare \u00eentre date<br \/>\nMai u\u015for de ad\u0103ugat date<br \/>\nStructur\u0103 mai flexibil\u0103<\/p>\n<div>O parte din defini\u0163ia unei baze de date rela\u0163ionale include \u015fi conceptul de \u201eForme Normale\u201d. Fiecare dintre forme sunt concepute pentru a aborda \u00een mod logic probleme poten\u0163iale la care se refer\u0103 \u00een lucrul cu informa\u0163iile stocate \u00eentr-o baz\u0103 de date.<\/div>\n<div>O baz\u0103 de date se spune c\u0103 este \u00eentr-una din formele normale \u00een cazul \u00een care \u00eendepline\u015fte regulile impuse de acea form\u0103.<\/div>\n<p><strong>Prima form\u0103 normal\u0103 (FN1)<\/strong><\/p>\n<div>\u201eO rela\u0163ie este \u00een FN1 dac\u0103 \u015fi numai dac\u0103 toate domeniile de baz\u0103 con\u0163in doar valori scalare, \u015fi fiecare atribut care o compune corespunzandu-i o valoare indivizibil\u0103 sau atomic\u0103.\u201d<\/div>\n<p>FN1 este adesea numita \u015fi regul\u0103 atomic\u0103. &#8220;Atom&#8221; vine de la un cuv\u00e2nt grecesc care \u00eenseamn\u0103, \u00een esen\u0163\u0103, piesa cea mai mic\u0103 posibil\u0103 dintr-un obiect. \u00centr-o baz\u0103 de date, acest lucru \u00eenseamn\u0103 c\u0103 fiecare coloan\u0103 ar trebui s\u0103 fie proiectat\u0103 exclusiv s\u0103 de\u0163in\u0103 numai o bucat\u0103 de informa\u0163ie.<\/p>\n<div>Pentru a aduce o rela\u0163ie \u00een FN1 putem folosi urm\u0103torul algoritm:<\/div>\n<p>1. \u00cenlocuim \u00een rela\u0163ie atributele compuse cu componentele acestora.<br \/>\n2. Cre\u0103m o nou\u0103 rela\u0163ie pentru fiecare din grupurile repetitive.<br \/>\n3. \u00cen fiecare rela\u0163ie pe care am creat-o la pasul 2 introducem \u00een schem\u0103 cheia primar\u0103 a rela\u0163iei din care am extras atributul repetitiv.<br \/>\n4. Stabilim cheia primar\u0103 pentru fiecare rela\u0163ie pe care am creat-o la pasul 2 care este alcatuit\u0103 din cheia pe care am introdus-o la pasul 3, precum \u015fi din alte atribute a noii rela\u0163ii.S\u0103 lu\u0103m \u00een considerare urm\u0103torul exemplu \u015fi s\u0103 vedem cum aducem un tabel nenormalizat \u00een prima form\u0103 normal\u0103 (FN1).<\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/tabel_3_Studenti.png\" alt=\"Tabel 3 Studenti\" width=\"662\" height=\"313\" \/><\/p>\n<p>Tabelul 3 este un tabel nenormalizat. Atributul cheie este \u201cID_STUD\u201d. \u0130dentific\u0103m grupurile repetitive care sunt de fapt detaliile despre camerele de camin pe care le ocupa studentii, anul \u015fi specializarea.<\/p>\n<div>Structura grupului repetitiv este urmatoarea:<\/div>\n<div>GrupRepetitiv ( NR_CAMIN, ADR_CAMIN, DATA_INTR, DATA_IES, CAMERA, AN, SPECIALIZARE )<\/div>\n<p>Putem vedea ca avem valori multiple la intersec\u0163ia anumitor r\u00e2nduri cu coloane. De exemplu se poate vedea \u00een tabelul 3 ca avem dou\u0103 valori ale atributului \u201cNR_CAMIN\u201d (98,102) care corespund studentului \u0130onescu Gigel. Ca s\u0103 putem aduce acest tabel \u00een forma de normalizare FN1 trebuie s\u0103 ne asigur\u0103m c\u0103 avem o singur\u0103 valoare la intersec\u0163ia dintre fiecare r\u00e2nd \u015fi fiecare coloan\u0103. Acest lucru \u00eel facem prin eliminarea grupului repetitiv. Deci eliminam grupul repetitiv plas\u00e2nd \u00eentr-o rela\u0163ie separat\u0103 datele respective \u00eempreun\u0103 cu o copie a atributului cheie initial \u201cID_STUD\u201d dup\u0103 care identific\u0103m o cheie primar\u0103 pentru noua noastr\u0103 relatie.<\/p>\n<div>Acum cele doua rela\u0163ii sunt urm\u0103toarele:<\/div>\n<p>Rela\u0163ia Studen\u0163i (ID_STUD, NUME_STUD)<br \/>\nRela\u0163ia CameraCamin ( ID_STUD, NR_CAMIN, ADR_CAMIN, DATA_INTR, DATA_IES, CAMERA, AN,<\/p>\n<p>SPECIALIZARE)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/rel_studenti.png\" alt=\"\" width=\"314\" height=\"93\" \/><\/p>\n<p>&nbsp;<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/rel_camera_camin.png\" alt=\"\" width=\"632\" height=\"263\" \/><\/p>\n<p>Cele dou\u0103 rela\u0163ii sunt acum \u00een FN1 deoarece avem o singur\u0103 valoare la intersec\u0163ia dintre fiecare r\u00e2nd \u015fi fiecare coloan\u0103.<\/p>\n<p>O alt\u0103 modalitate de a elimina grupul repetitiv este s\u0103 transform\u0103m un r\u00e2nd care con\u0163ine mai multe valori ale unui atribut \u00een mai multe randuri care s\u0103 con\u0163in\u0103 o singur\u0103 valoare pentru acel atribut, iar relatia care va rezulta \u015fi pe care am denumit-o CameraCamin va fi in FN1, apoi trebuie s\u0103 identificam cheile candidat ale rela\u0163iei noastre CameraCamin care sunt de fapt chei compuse \u015fi anume (ID_STUD, NR_CAMIN), (ID_STUD, DATA_INTR), (NR_CAMIN, DATA_INTR). Acum alegem drept cheie primar\u0103 urmatoarele atribute (ID_STUD, NR_CAMIN)<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/rel_camera_camin.png\" alt=\"\" width=\"632\" height=\"263\" \/><\/p>\n<div>Rela\u0163ia <strong>CameraCamin<\/strong> o definim \u00een felul urm\u0103tor:<\/div>\n<p>CameraCamin (ID_STUD, NR_CAMIN, NUME_STUD, ADR_CAMIN, DATA_INTR, DATA_IES, CAMERA, AN, SPECIALIZARE)Aceast\u0103 rela\u0163ie este \u00een forma FN1 pentru c\u0103 avem o singur\u0103 valoare la intersec\u0163ia dintre fiecare r\u00e2nd \u015fi coloan\u0103, dar totu\u015fi rela\u0163ia noastr\u0103 con\u0163ine date care se repet\u0103 de mai multe ori \u015fi prin urmare este supus\u0103 anomaliilor de reactualizare. Ca s\u0103 putem elimina aceast\u0103 anomalie de reactualizare trebuie s\u0103 transformam rela\u0163ia noastra \u00een forma FN2.<\/p>\n<p><strong>A doua form\u0103 normala (FN2)<\/strong><\/p>\n<div>\u201eO rela\u0163ie este \u00een FN2 dac\u0103 \u015fi numai dac\u0103 este \u00een FN1 \u015fi fiecare atribut care nu este cheie este ireductibil \u015fi depinde de cheia primar\u0103.\u201d<\/div>\n<div>Pentru a aduce o rela\u0163ie din FN1 \u00een forma FN2 trebuie s\u0103 elimin\u0103m dependen\u0163ele par\u0163iale, iar acest lucru \u00eel facem dac\u0103 elimin\u0103m din rela\u0163ie atributele care sunt par\u0163ial dependente func\u0163ional \u015fi le plas\u0103m \u00eentr-o alt\u0103 rela\u0163ie.<\/div>\n<div>S\u0103 lu\u0103m \u00een considerare urm\u0103torul exemplu :<\/div>\n<div>Analiz\u0103m dependen\u0163ele func\u0163ionale din rela\u0163ia &#8220;CameraCamin&#8221; care are ca cheie primar\u0103 atributele (ID_STUD, NR_CAMIN).<\/div>\n<p>ID_STUD, NR_CAMIN -&gt; DATA_INTR, DATA_IES (cheie primar\u0103)<br \/>\nID_STUD -&gt; NUME_STUD (dependen\u0163\u0103 partial\u0103)<br \/>\nNR_CAMIN -&gt; ADR_CAMIN, CAMERA, AN, SPECIALIZARE (dependen\u0163\u0103 partial\u0103)<br \/>\nAN -&gt; SPECIALIZARE (dependen\u0163\u0103 tranzitiv\u0103)<br \/>\nID_STUD , DATA_INTR -&gt; NR_CAMIN, ADR_CAMIN, DATA_IES, CAMERA, AN, SPECIALIZARE (cheie candidat)<br \/>\nNR_CAMIN, DATA_INTR -&gt; ID_STUD, NUME_STUD, DATA_IES (cheie candidat)<\/p>\n<div>Acum verificam dac\u0103 rela\u0163ia &#8220;CameraCamin&#8221; se afl\u0103 \u00een forma FN2 prin identificarea dependen\u0163elor par\u0163iale de cheia primar\u0103. Putem remarca urm\u0103toarele:<\/div>\n<p>Atributul (NUME_STUD) este dependent par\u0163ial de cheia primar\u0103 ID_STUD.<br \/>\nAtributele (ADR_CAMIN, CAMERA, AN, SPECIALIZARE ) sunt par\u0163ial dependente de cheia primar\u0103, ele sunt dependente numai de atributul &#8220;NR_CAMIN&#8221;.<\/p>\n<div>Ca s\u0103 putem transforma rela\u0163ia &#8220;CameraCamin&#8221; \u00een forma FN2 trebuie s\u0103 cre\u0103m noi rela\u0163ii astfel \u00eencat s\u0103 elimin\u0103m atributele care nu sunt chei primare \u00eempreun\u0103 cu o copie a p\u0103r\u0163ii din cheia primar\u0103 de care sunt total dependente. \u00cen acest mod ob\u0163inem trei rela\u0163ii noi \u015fi anume:<\/div>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/relatia_student.png\" alt=\"\" width=\"317\" height=\"105\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/rel_ocupare_camera.png\" alt=\"\" width=\"504\" height=\"259\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/rel_camin_student.png\" alt=\"\" width=\"545\" height=\"154\" \/><\/p>\n<p>Student (ID_STUD, NUME_STUD)<br \/>\nOcupareCamera (ID_STUD, NR_CAMIN, DATA_INTR, DATA_IES )<br \/>\nCaminStudent (NR_CAMIN, ADR_CAMIN, CAMERA, AN, SPECIALIZARE )<strong>A treia form\u0103 normal\u0103 (FN3)<\/strong><\/p>\n<div>Ca s\u0103 putem \u00een\u0163elege a treia form\u0103 normal\u0103 (FN3) trebuie s\u0103 \u00een\u0163elegem mai \u00eentai ce este dependen\u0163a tranzitiv\u0103. Un atribut care depinde de alt atribut care nu este cheie primar\u0103 sau identificator unic a unei rela\u0163ii spunem ca este dependent tranzitiv.<\/div>\n<div>Ca s\u0103 aducem la a treia form\u0103 normal\u0103 (FN3) o rela\u0163ie care este \u00een a doua form\u0103 normal\u0103 (FN2), mut\u0103m atributele dependente tranzitiv \u00een rela\u0163ii \u00een care depind numai de cheia primar\u0103.<\/div>\n<div>\u201eO rela\u0163ie este \u00een FN3 dac\u0103 este \u00een FN2 \u015fi fiecare atribut care nu este cheie nu este dependent tranzitiv de cheia primar\u0103.\u201d<\/div>\n<div>Deci o rela\u0163ie este \u00een a treia form\u0103 normal\u0103 (FN3), atunci c\u00e2nd aceasta \u00eendepline\u015fte cerin\u0163a de a fi \u00een a doua form\u0103 normal\u0103 (FN2) \u015fi de asemenea:<\/div>\n<p>&#8211; dependen\u0163ele func\u0163ionale asupra c\u00e2mpurilor care nu sunt cheie sunt eliminate prin plasarea acestora \u00eentr-un tabel separat. La acest nivel, toate c\u00e2mpurile (coloanele) care nu sunt cheie depind de cheia primar\u0103.<br \/>\n&#8211; un r\u00e2nd este \u00een form\u0103 normal\u0103 (FN3) dac\u0103 \u015fi numai dac\u0103 este \u00een a doua form\u0103 normal\u0103 (FN2) \u015fi atributele care nu contribuie la o descriere a cheii primare sunt mutate \u00eentr-un tabel separat.<\/p>\n<div>In exemplul urm\u0103tor analiz\u0103m dependen\u0163ele func\u0163ionale din tabelele (rela\u0163iile) \u201eStudent\u201d, \u201eOcupareCamera\u201d \u015fi \u201eCaminStudent\u201d.<\/div>\n<p>Tabelul Student<br \/>\nID_STUD -&gt; NUME_STUD<\/p>\n<p>Tabelul OcupareCamera<br \/>\nID_STUD, NR_CAMIN -&gt; DATA_INTR, DATA_IES<br \/>\nID_STUD, DATA_INTR -&gt; NR_CAMIN, DATA_IES<br \/>\nNR_CAMIN, DATA_INTR -&gt; ID_STUD, DATA_IES<\/p>\n<p>Tabelul CaminStudent<br \/>\nNR_CAMIN -&gt; ADR_CAMIN, CAMERA, AN, SPECIALIZARE (dependen\u0163a partial\u0103)<br \/>\nAN-&gt; SPECIALIZARE (dependen\u0163a tranzitiv\u0103)<\/p>\n<div>Toate atributele tabelelor (rela\u0163iilor) \u201eStudent\u201d \u015fi \u201eOcupareCamera\u201d care nu sunt chei primare sunt functional dependente doar de cheile primare. \u00cen aceste rela\u0163ii (tabele) nu avem dependente tranzitorii, deci se gasesc deja \u00een FN3.<\/div>\n<div>\u00cen tabelul (rela\u0163ia) \u201eCaminStudent\u201d atributul \u201eSPECIALIZARE\u201d este dependent tranzitiv de atributul \u201eAN\u201d. Ca sa putem transforma acest tabel (rela\u0163ie) \u00een FN3 trebuie s\u0103 elimin\u0103m aceast\u0103 dependent\u0103 tranzitiv\u0103. Facem acest lucru dac\u0103 cream alte dou\u0103 noi rela\u0163ii (tabele) \u015fi anume \u201eCamin\u201d \u015fi \u201eStudentul\u201d.<\/div>\n<p>Camin (NR_CAMIN, ADR_CAMIN, CAMERA)<\/p>\n<p>Studentul (AN, SPECIALIZARE)<img loading=\"lazy\" decoding=\"async\" class=\"alignleft\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/tabel_camin.png\" alt=\"\" width=\"423\" height=\"142\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/studentul.png\" alt=\"\" width=\"270\" height=\"123\" \/><\/p>\n<div>Acum putem observa c\u0103 tabelul nenormalizat \u201eStudenti\u201d l-am transformat prin intermediul procesului de normalizare \u00een patru rela\u0163ii (tabele) de forma FN3. Acestea sunt:<\/div>\n<p>Student ( ID_STUD, NUME_STUD )<br \/>\nOcupareCamera ( ID_STUD, NR_CAMIN, DATA_INTR, DATA_IES )<br \/>\nCamin ( NR_CAMIN, ADR_CAMIN, CAMERA )<br \/>\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/stud.png\" alt=\"\" width=\"327\" height=\"105\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/ocupare_cam.png\" alt=\"\" width=\"514\" height=\"267\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/tab_camin.png\" alt=\"\" width=\"431\" height=\"142\" \/><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/t_studentul.png\" alt=\"\" width=\"263\" height=\"120\" \/><\/p>\n<p><strong>Reguli de integritate <\/strong><\/p>\n<div>Modelul rela\u021bional define\u0219te anumite reguli de integritate, care, de\u0219i nu fac parte din defini\u021bia formelor normale sunt, totu\u0219i, o parte necesar\u0103 a oric\u0103rei baze de date rela\u021bionale. Exist\u0103 dou\u0103 tipuri de reguli de integritate: generale \u0219i specifice bazei de date. Aceste reguli reglementeaz\u0103 opera\u021biile care pot fi efectuate asupra datelor \u0219i a structurii bazei de date.<\/div>\n<div>Modelul rela\u021bional specific\u0103 dou\u0103 reguli generale de integritate. Acestea sunt denumite reguli generale, pentru c\u0103 se aplic\u0103 la toate bazele de date. Acestea sunt: integritatea entit\u0103\u021bii \u0219i integritatea referen\u021bial\u0103. Regula de integritate a entit\u0103\u021bii se refer\u0103 la constr\u0103ngerea pe care cheia primar\u0103 trebuie s\u0103 o respecte \u015fi aceasta ne spune c\u0103 cheia primar\u0103 nu poate con\u021bine valori \u201cnull\u201d \u015fi de asemenea trebuie s\u0103 fie unic\u0103. Nu putem identifica \u00een mod unic un r\u00e2nd sau s\u0103 facem o referire \u00eentr-un tabel, \u00een cazul \u00een care cheia primar\u0103 a tabelului are valoarea \u201cnull\u201d. De asemenea aceast\u0103 regul\u0103 se aplic\u0103 la ambele chei simple \u015fi compuse. Pentru chei compuse, nici una dintre coloanele individuale nu pot fi de tip \u201cnull\u201d. Dac\u0103 un tabel nu \u00eendepline\u0219te aceste dou\u0103 cerin\u021be, spunem ca tabelul respectiv \u00eencalc\u0103 regula de integritate a entit\u0103\u021bii.<\/div>\n<div>Regula de integritate referen\u021bial\u0103 spune c\u0103 orice valoare a cheii extern\u0103 (str\u0103in\u0103) trebuie s\u0103 se potriveasc\u0103 la o valoare de cheie primar\u0103 \u00eentr-un tabel asociat. Integritate referen\u021bial\u0103 ne asigur\u0103 c\u0103 putem naviga \u00een mod corect \u00eentre entit\u0103\u021bile de leg\u0103tur\u0103. Aceast\u0103 constr\u00e2ngere este specificat\u0103 \u00eentre dou\u0103 tabele (p\u0103rinte \u0219i copil), ea men\u021bine coresponden\u021ba dintre r\u00e2ndurile din aceste tabele. Aceasta \u00eenseamn\u0103 ca referin\u021ba unui r\u00e2nd dintr-un tabel \u00een alt tabel trebuie s\u0103 fie valid\u0103.<\/div>\n<p>Exemplu de constr\u00e2ngere de integritate referen\u0163iala:<\/p>\n<div>Avem dou\u0103 rela\u0163ii, entita\u0163i sau tabele \u015fi anume \u201cANGAJAT\u201d \u015fi \u201cCONT\u201d cu urmatoarele atribute\/c\u00e2mpuri:<\/div>\n<p>ANGAJAT( ang_id, ang_nume)<br \/>\nCONT( cont_id, ang_id, data_cont)<\/p>\n<div>Pentru a ne asigura c\u0103 nu exist\u0103 \u00eenregistr\u0103ri care nu se potrivesc, avem nevoie s\u0103 impunem regula de integritate referen\u021bial\u0103. O \u00eenregistrare invalid\u0103 este acea valoare a cheii str\u0103ine a c\u0103rei valoare nu este g\u0103sit\u0103 \u00een entitatea corespondent\u0103, adic\u0103 acolo unde se afl\u0103 cheia primar\u0103. Trebuie s\u0103 existe o asociere \u00eentre cheia primar\u0103 \u015fi cheia str\u0103in\u0103 a celor dou\u0103 rela\u0163ii. Deci regula de integritate referin\u0163ial\u0103 \u00een cazul celor dou\u0103 entita\u0163i din exemplu ne spune ca \u201cang_id\u201d din tabelul \u201cCONT\u201d trebuie s\u0103 se potriveasc\u0103 cu valoarea cheii primare \u201cang_id\u201d din tabelul \u201cANGAJAT\u201d. Deci c\u00e2nd se creeaz\u0103 tabelele se stabilesc \u015fi constr\u00e2ngerile de integritate referen\u021bial\u0103.<\/div>\n<p><!--more--><\/p>\n<p><strong>Securitatea \u00een BD Oracle<\/strong><\/p>\n<div>De ce securizarea datelor ?<\/div>\n<div>Este important s\u0103 \u00een\u021belegem de la bun \u00eenceput de ce trebuie s\u0103 investim \u00een securitatea unui SGBD ?<\/div>\n<div>Voi incerca s\u0103 r\u0103spund la aceast\u0103 \u00eentrebare pe parcursul acestui capitol. Toate informa\u0163iile care intereseaz\u0103 \u015fi prezint\u0103 importan\u0163\u0103 se afl\u0103 de obicei stocate \u00eentr-o baz\u0103 de date. Fie c\u0103 este vorba de date financiare, date despre o anumit\u0103 companie, date despre clien\u0163i sau angaja\u021bi, informa\u021bii despre carduri de credit, toate aceste informa\u0163ii se stocheaz\u0103 \u00een general \u00eentr-o baz\u0103 de date.<\/div>\n<div>Securitatea, la fel ca orice alt\u0103 investi\u021bie \u00een domeniul IT trebuie s\u0103 fie justificat\u0103 \u015fi s\u0103 fie \u00een m\u0103sur\u0103 s\u0103 r\u0103spund\u0103 la \u00eentrebarea de ce securizarea datelor este important\u0103. Securitatea este din multe puncte de vedere o art\u0103 defensiv\u0103. Trebuie s\u0103 \u00een\u021belegem atacatorii, care sunt motiva\u021biile lor, spre ce anume \u0163intesc, \u015fi modul \u00een care ace\u015ftia vor \u00eencerca s\u0103 i\u015fi ating\u0103 scopul. Pentru scenariul de jaf bancar, motiva\u021biile \u015fi \u0163inta sunt evidente. Efectuarea unei analize a securita\u0163ii unei banci implic\u0103 o \u00een\u021belegere a faptului cine sunt poten\u0163ialii ho\u021bi, (angaja\u021bi sau din afara bancii) \u015fi modul \u00een care ace\u015ftia vor \u00eencerca s\u0103 fure banii. Dac\u0103 personalul unei institu\u0163ii de exemplu nu \u00een\u021belege de ce anume trebuie s\u0103 se protejeze \u015fi ce anume poate oferi protec\u0163ie s-ar putea aplica o solu\u0163ie de securitate pentru o problem\u0103 care fie nu exist\u0103, fie nu poate fi rezolvat\u0103 cu tactica avut\u0103 \u00een vedere.<\/div>\n<div>Multe dintre tehnicile folosite pentru a preveni furtul de c\u0103tre angaja\u021bii b\u0103ncii sunt diferite de cele folosite pentru a preveni furtul de la persoanele din afara b\u0103ncii.<\/div>\n<div>Dac\u0103 cineva \u00eentreab\u0103, &#8220;Cum pot face \u00een mod eficient criptarea datelor?&#8221; Ar putea s\u0103 apar\u0103 \u00eentrebarea, &#8220;De ce crezi c\u0103 ai nevoie de criptarea datelor? Ce date vrei sa protejezi, \u015fi de cine? R\u0103spunsurile la aceste \u00eentreb\u0103ri ne va ghida spre solu\u0163ia de securitate corect\u0103 \u015fi ne ajut\u0103 s\u0103 ne asigur\u0103m c\u0103 folosim instrumentele \u015fi tehnicile adecvate.<\/div>\n<p><!--more--><br \/>\n<strong>Proiectarea securit\u0103\u0163ii<\/strong><\/p>\n<div>C\u00e2nd suntem \u00eentrebati, &#8220;C\u00e2nd \u00eencepe securitatea?&#8221; Mul\u021bi vor r\u0103spunde atunci c\u00e2nd utilizatorul se autentific\u0103. Securitatea \u00eencepe atunci c\u00e2nd este proiectat\u0103 aplica\u0163ia. Primul principiul este acesta: Securitate trebuie s\u0103 fie construit\u0103 \u00een sistem, \u015fi nu dup\u0103 aceea. O proiectare adecvat\u0103 a securit\u0103\u021bii ne ajut\u0103 s\u0103 ne asiguram c\u0103 o aplica\u021bie va fi corect securizat\u0103.<\/div>\n<div>Al doilea principiu pentru o securitate eficient\u0103 ne spune c\u0103 securitatea ar trebui s\u0103 fie compus\u0103 din mai multe nivele. Acest lucru implic\u0103 faptul nu vom avea niciun punct slab sau vulnerabil \u00een cadrul domeniului securit\u0103\u021bii.\uf020Prin crearea de nivele multiple de securitate, putem genera un sistem cu securitate mai mare. \u00cen cazul \u00een care se trece de un nivel, un alt nivel va \u021bine locul. Ap\u0103rare \u00een profunzime este folosit\u0103 cu succes \u00een multe domenii ale tehnologiei, \u015fi este, de asemenea, aplicabil\u0103 \u015fi cererilor bazelor de date. Prin folosirea de instrumente adecvate securit\u0103\u021bii, proiectate \u015fi implementate pe mai multe nivele, putem s\u0103 punem bazele pentru un mediu cu adev\u0103rat sigur.<\/div>\n<div>Al treilea principiul eficient al securita\u0163ii este acela de a se acorda mai pu\u0163ine drepturi asupra sistemului (aplica\u0163iei). Cele mai pu\u021bine drepturi \u00eenseamn\u0103 s\u0103 acord\u0103m oamenilor numai permisiunile de care au nevoie pentru a putea s\u0103 i\u015fi fac\u0103 treaba \u015fi nimic mai mult.<\/div>\n<div>Unul dintre cele mai simple moduri de a compromite un sistem este acela de a exploata acele conturi la care au fost acordate prea multe privilegii.<\/div>\n<div>\u0130deea care st\u0103 la baza acord\u0103rii privilegilor minime unui utilizator este simpl\u0103. Incepe prin neacordarea de drepturi \u015fi apoi se acord\u0103 numai drepturile sau privilegiile minime necesare.<\/div>\n<div>Nerespectarea principiului acord\u0103rii celor mai mici privilegii poate duce la consecin\u021be.<\/div>\n<div>Pentru administratorii care nu sunt familiariza\u021bi cu securitatea bazei de date, este nevoie de munc\u0103, \u00een general, s\u0103 se stabileasc\u0103 exact ce privilegii sunt necesare pentru a efectua un set de sarcini. grave. Sa lu\u0103m \u00een considerare un exemplu \u00een cazul bazelor de date.De ce nu este acest principiu respectat \u00een mod regulat? Un motiv principal pentru care acest principiu nu este respectat este comoditatea. \u00cen principiu faptul de a acorda toate privilegiile unui utilizator este gre\u015fit.<\/div>\n<div>Securitatea unei bazei de date se bazeaz\u0103 pe privilegii. Abuzul de privilegii nu poate avea loc \u00een cazul \u00een care drepturile nu au fost acordate. \u00cen timp ce este nevoie de un efort suplimentar pentru a determina ce drepturi sunt necesare, este esen\u021bial men\u021binerea privilegilor minime \u015fi privilegile minime sunt necesare pentru o securitate eficient\u0103.<\/div>\n<p><!--more--><br \/>\n<strong> Securizarea bazei de date Oracle<\/strong><\/p>\n<div>Ce trebuie s\u0103 facem \u015fi care sunt pa\u015fii necesari pe care trebuie sa-i urm\u0103m \u00een primul r\u00e2nd pentru a asigura securitatea \u00een mod corespunz\u0103tor \u00eentr-o baz\u0103 de date Oracle? \u00cen acest capitol, am s\u0103 analizez patru elementele de baz\u0103 pentru gestionare riscurilor utilizate pentru a proteja bazele de date Oracle \u015fi datele lor:<\/div>\n<p>1. Autentificarea<br \/>\n2. Controlul accesului<br \/>\n3. Configurarea securita\u0163ii<\/p>\n<p><!--more--><br \/>\n4. Auditul<strong>1.Autentificarea<\/strong><\/p>\n<div>Autentificarea este primul pas \u00een ob\u0163inerea accesului la o baz\u0103 de date. Oracle are mai multe moduri de a se autentifica la baza de date. Prin aceste metode vin \u015fi multe riscuri \u00een cazul \u00een care autentificarea nu este gestionat\u0103 \u00een mod corespunz\u0103tor. Vulnerabilit\u0103\u021bile cele mai evidente sunt conturile implicite \u015fi parolele. De la lansarea versiunii Oracle9i, Oracle a blocat conturile, precum \u015fi setarea parolelor asociate cu cele mai multe conturi implicite s\u0103 expire dup\u0103 instalare. De fapt, doar c\u00e2teva conturi sunt de obicei accesibile dup\u0103 instalare.<\/div>\n<div>Exist\u0103 aproximativ 600 de combina\u0163ii de nume de utilizator implicite \u015fi parole care pot exista \u00een Oracle, \u00een func\u021bie de modul \u00een care este configurat. Este esen\u021bial pentru securitatea sistemului s\u0103 modific\u0103m aceste conturi implicite. Din fericire, \u00een versiunea Oracle Database 11g, Oracle include vizualizarea \u201edba_users_with_defpwd\u2019, care face mai u\u015for verificarea acestor conturi de utilizator cu parole implicite prin urm\u0103toarea interogare:<\/div>\n<p>SQL&gt; SELECT * FROM dba_users_with_defpwd<\/p>\n<div>Cu toate acestea, este important s\u0103 \u015ftim c\u0103 nu toate parolele pot fi verificate prin intermediul acestei vizualiz\u0103ri. Unele sunt specifice aplica\u0163iei, \u015fi nu ne putem a\u015ftepta la baza de date Oracle s\u0103 \u015ftie despre toate conturile specifice aplicatiei care pot fi ad\u0103ugate la baza de date. De aceea, ar trebui s\u0103 efectu\u0103m \u00eenc\u0103 o verificare pentru a vedea dac\u0103 avem conturi implicite r\u0103mase. Pentru a verifica aceste conturi, putem utiliza o list\u0103 de conturi implicit\u0103, \u015fi apoi s\u0103 o compar\u0103m cu rezultatul pe care \u00eel ob\u0163inem de la urm\u0103toarea interogare:<\/div>\n<p>SQL&gt; SELECT username, password from dba_users;<\/p>\n<div>Oracle ofer\u0103, de asemenea, protec\u0163ie \u00een continuare profilurilor conturilor bazei de date. Prin interogarea \u201edba_users\u201d, putem identifica ce profil a fost aplicat \u015fi la care cont:<\/div>\n<p>SQL&gt; SELECT username, profile FROM dba_users;<\/p>\n<div>Odat\u0103 ce \u015ftim ce profile sunt p\u00e2rghie, putem interoga \u201edba_profiles\u2019 pentru a determina set\u0103rile de profil:<\/div>\n<p>SQL&gt; SELECT * FROM dba_profiles;<\/p>\n<div>Aici vom g\u0103si set\u0103rile legate de parol\u0103. Exist\u0103, de asemenea, o serie de parametri de configurare care trebuie lua\u0163i \u00een considerare atunci c\u00e2nd se utilizeaz\u0103 conturi autentificate ale sistemului de operare, \u00een special, \u201eremote_os_authent\u201d \u015fi parametrii \u201eremote_os_roles\u201d. Aceste set\u0103ri de parametri determin\u0103 dac\u0103 Oracle va avea \u00eencredere \u00een sistemele de operare de la distan\u021b\u0103 sau numai \u00een sistemul de operare local pentru aceste conturi. De exemplu, \u00een cazul \u00een care \u201eremote_os_authent\u201d este setat la TRUE, Oracle va avea \u00eencredere \u00een orice sistem de operare de la distan\u021b\u0103. De aceea, trebuie s\u0103 limit\u0103m num\u0103rul de conturi autentificate ale sistemului de operare \u015fi ce sisteme de operare s\u0103 poat\u0103 s\u0103 fac\u0103 autentificarea. Urm\u0103toarea interogare identific\u0103 conturile care sunt autentificate sistemului de operare:<\/div>\n<p>SQL&gt; SELECT username FROM dba_users WHERE password=\u2019EXTERNAL\u2019;<strong>2. Controlul accesului<\/strong><\/p>\n<div>Verificarea \u201econtrol acces\u201d este esen\u0163ial\u0103 pentru securizarea \u00een mod corespunz\u0103tor a bazei de date.<\/div>\n<div>Dup\u0103 ce un utilizator a fost autentificat, controalele de acces dicteaz\u0103 ce \u00eei este permis utilizatorului s\u0103 fac\u0103. Preocup\u0103rile concernelor, de asemenea, a condus la acordarea utilizatorilor o serie de privilegii \u015fi permise de care nu au nevoie. De exemplu, atunci c\u00e2nd func\u021bionalitatea nu lucreaz\u0103 cum era de a\u015fteptat, un administrator ar putea emite o comand\u0103 de genul &#8220;acord\u0103 toate privilegiile utilizatorului&#8221;, pentru a permite accesul, uneori doar temporar, dar apoi uit\u0103 s\u0103 revin\u0103 \u00eenapoi la privilegiile \u015fi set\u0103rile anterioare. Cu acest nivel de acces, utilizatorii primesc peste 100 de privilegii, dintre care multe din ele poate nu au nevoie. Exist\u0103, de asemenea, o setare de acces public \u00een care orice utilizator care are un cont la baza de date Oracle automat i se acordat\u0103 privilegii publice. \u00cen mod implicit, privilegile publice au un num\u0103r mai mare de drepturi, dintre care multe ar trebui s\u0103 fie limitate \u00een majoritatea mediilor. Un privilegiu specific poate s\u0103 ob\u0163in\u0103 literalmente privilegii publice. Atunci c\u00e2nd controalele de acces sunt inactive trebuie s\u0103 ne uit\u0103m la privilegiile fiec\u0103rui utilizator individual, precum \u015fi la privilegiile acordate pentru public.<\/div>\n<div>Urm\u0103toarele interog\u0103ri identific\u0103 privilegiile acordate \u00een cadrul mediului:<\/div>\n<p>SQL&gt; SELECT * FROM dba_sys_privs;<br \/>\nSQL&gt; SELECT * FROM dba_role_privs;<br \/>\nSQL&gt; SELECT * FROM dba_col_privs;<br \/>\nSQL&gt; SELECT * FROM dba_tab_privs;<\/p>\n<div>Separarea sarcinilor este de asemenea important\u0103. Separarea sarcinilor se aplic\u0103 \u00eentr-o mul\u021bime de moduri diferite \u00een cadrul medilor. De exemplu, rolurile administratorului bazei de date \u015fi audit-ului trebuie s\u0103 fie diferite \u015fi cu responsabilit\u0103\u021bi \u015fi cerin\u021bele de acces separate. Este, de asemenea, important s\u0103 se separe mediile de produc\u021bie, de cele de testare, precum \u015fi de dezvoltare.<\/div>\n<div>Ca o concluzie, trebuie s\u0103 lu\u0103m, \u00een considerare aplica\u0163ia. Fiecare aplica\u0163ie este diferit\u0103 \u015fi poate introduce riscuri unice la baza de date, cum ar fi vulnerabilitatea la atacurile SQL injection \u015fi aplicarea altor metode de atac a bazei de date.<\/div>\n<p><!--more--><br \/>\n<strong>3. Configurarea securit\u0103\u0163ii<\/strong><\/p>\n<div>Am s\u0103 subliniez unele dintre domeniile-cheie de configurare. Acestea includ:<\/div>\n<div>Ascultarea portutilor: punctul de contact ini\u021bial pentru o baz\u0103 de date Oracle este portul ascultat. Atunci c\u00e2nd un utilizator doreste s\u0103 se conecteze de la distan\u021b\u0103 la baza de date Oracle, el se conecteaz\u0103 de fapt la portul pe care asculta aplica\u0163ia server pentru a face acea conexiune. F\u0103r\u0103 ascultarea porturilor, nu ne putem conecta la baza de date. Este important s\u0103 ne asigur\u0103m c\u0103 suntem conecta\u0163i la porturile pe care asculta aplica\u0163ia server. Mecanismele de autentificare local\u0103 a sistemului de operare au fost \u00eencorporate \u00een toate versiunile de Oracle de la lansarea Oracle Database 10g. Fi\u015fierul \u201elistener.ora\u201d va con\u021bine informa\u021bii despre set\u0103rile de conectare.<\/div>\n<div>Parametrii: Ca urmare exist\u0103 o list\u0103 de parametri-cheie care pot controla multe din riscurile de securitate \u00een baza de date. Desigur, ace\u015ftia nu sunt to\u021bi parametrii importan\u021bi, dar sunt cei mai mari parametrii cu grad mare de risc. Unii dintre ace\u015fti parametri nu au existat \u00eenainte de versiunea Oracle Database 11g, de\u015fi majoritatea au existat. Ace\u015ftia sunt:<\/div>\n<p>\u2022 AUDIT_FILE_DEST<br \/>\n\u2022 AUDIT_SYS_OPERATIONS (Should be set to TRUE.)<br \/>\n\u2022 AUDIT_TRAIL (Avoid FALSE or NONE settings.)<br \/>\n\u2022 DIAGNOSTIC_DEST<br \/>\n\u2022 DISPATCHERS<br \/>\n\u2022 GLOBAL_NAMES (Should be set to TRUE.)<br \/>\n\u2022 LOG_ARCHIVE_% (Note: There are multiple parameters that exist that begin with LOG_ARCHIVE.)<br \/>\n\u2022 MAX_ENABLED_ROLES<br \/>\n\u2022 O7_DICTIONARY_ACCESSIBILITY (Should be set to FALSE.)<br \/>\n\u2022 OS_AUTHENT_PREFIX (Should be set to NULL, if possible. Should not be set to ops$.)<br \/>\n\u2022 OS_ROLES (Should be set to FALSE.)<br \/>\n\u2022 REMOTE_LISTENER (Should be set to NULL, unless a remote listener is needed.)<br \/>\n\u2022 REMOTE_LOGIN_PASSWORDFILE (Should be set to NONE, if possible.)<br \/>\n\u2022 REMOTE_OS_AUTHENT (Should be set to FALSE.)<br \/>\n\u2022 REMOTE_OS_ROLES (Should be set to FALSE.)<br \/>\n\u2022 RESOURCE_LIMIT (Should be set to TRUE.)<br \/>\n\u2022 SEC_CASE_SENSITIVE_LOGON (Should be set to TRUE.)<br \/>\n\u2022 SEC_MAX_FAILED_LOGIN_ATTEMPTS (Should be set to 10.)<br \/>\n\u2022 SEC_PROTOCOL_ERROR_FURTHER_ACTION (Avoid the setting NONE.)<br \/>\n\u2022 SEC_PROTOCOL_ERROR_TRACE_ACTION (Avoid the setting NONE.)<br \/>\n\u2022 SEC_RETURN_SERVER_RELEASE_BANNER (Should be set to FALSE.)<br \/>\n\u2022 SMTP_OUT_SERVER (Should list only authorized SMTP servers, if utilized.)<br \/>\n\u2022 SPFILE<br \/>\n\u2022 SQL92_SECURITY (Should be set to TRUE.)<br \/>\n\u2022 UTL_FILE_DIR (Should be set to a specific directory used only for necessary purposes. Values such as \/tmp or * should not exist.)<br \/>\n\u2022 _TRACE_FILES_PUBLIC (Should be set to FALSE.)Putem aborda vulnerabilit\u0103\u021bile de securitate pe care le-am men\u021bionat mai sus, prin aplicarea patch-urilor. Fara patch-uri corespunz\u0103toare \u00een vigoare, un atacator ar putea folosi vulnerabilit\u0103\u021bile respective pentru a exploata privilegiile lor sau chiar pentru a ob\u0163ine accesul.<\/p>\n<div>Pentru a vizualiza patch-urile care au fost instalate, utiliz\u0103m comanda \u201eopatch lsinventory\u201d de la sistemul de operare. \u00cen cele din urm\u0103, \u00een cazul \u00een care am simplifica foarte mult o baz\u0103 de date Oracle, aceasta este \u00een esen\u021b\u0103 o gr\u0103mad\u0103 de fi\u015fiere pe un sistem de operare, de aceea, securitatea sistemului de operare este critic\u0103. \u00cen plus, m\u0103surile de securitate de re\u021bea, cum ar fi firewall-uri, IDS \/ IPS, segmentarea, \u015fi asa mai departe, sunt extrem de utile \u015fi ofer\u0103 niveluri suplimentare de protec\u021bie \u00eempotriva atacatorilor \u015fi abuzurilor din interiorul bazei de date.<\/div>\n<p><!--more--><br \/>\n<strong>4. Auditul<\/strong><\/p>\n<div>Securitate \u00eenseamn\u0103 nu numai prevenirea atacurilor, de asemenea, \u00eenseamna \u015fi detectarea poten\u021bialelor atacuri. Acesta este cazul \u00een care auditul poate fi benefic. Auditul ne permite s\u0103 monitoriz\u0103m mediul \u015fi s\u0103 identific\u0103m poten\u021biale atacuri. \u00cen primul r\u00e2nd parametrul \u201eaudit_sys_operations\u201d ar trebui setat la valoarea TRUE. Parametrul \u201eaudit_trail\u201d ne spune dac\u0103 auditul bazei de date a fost activat \u00een cadrul bazei de date \u015fi unde acesta a expediat datele.<\/div>\n<div>De exemplu, datele auditului (de control) pot fi scrise \u00een baza de date, syslog, sau \u00een fi\u015fiere XML \u00een func\u021bie de cum este specificat parametrul. Presupun\u00e2nd c\u0103 auditul a fost activat, vizualiz\u0103rile specifice ne spune ce se \u00eent\u00e2mpla. Concret, urm\u0103toarele interog\u0103ri ne spun dac\u0103 con\u0163inutul vizualiz\u0103rilor respective sau un privilegiu sunt verificate.<\/div>\n<p>SQL&gt; SELECT * FROM dba_stmt_audit_opts<br \/>\nSQL&gt; SELECT * FROM dba_priv_audit_opts;Putem utiliza urm\u0103toarea interogare pentru a determina obiectul verificat:<\/p>\n<p>SQL&gt; SELECT * FROM dba_obj_audit_opts;<\/p>\n<div>\u00cen cazul \u00een care auditul(controlul) nu este activat, trebuie s\u0103 activ\u0103m auditul de activit\u0103\u021bi, cum ar fi crearea de sesiuni \u015fi alte date \u015fi comenzi definite precum crearea sau stergerea tabelelor. \u00cencepand cu versiunea Oracle Database 11g, Oracle ofer\u0103 o list\u0103 recomandat\u0103 de set\u0103ri implicite de control (audit). Putem activa aceste set\u0103ri pe timpul instal\u0103rii versiunii Oracle Database 11g Release 1. Oracle Database 11g Release 2 porneste automat set\u0103rile implicite recomandate.<\/div>\n<div>Putem vedea lista set\u0103rilor implicite de control (audit) \u00een documenta\u021bia Oracle.<\/div>\n<div>Dup\u0103 ce am activat set\u0103rile de audit (control), este important s\u0103 centraliz\u0103m datele auditului \u015fi s\u0103 cream rapoarte, astfel \u00eenc\u00e2t s\u0103 putem revedea \u00eenregistr\u0103rile auditului.<\/div>\n<p><!--more--><br \/>\n<strong>Criptarea<\/strong><\/p>\n<div>Criptografia este un termen larg care include utilizarea de tehnici matematice, \u00een contextul securit\u0103tii informa\u021biilor. Cuv\u00e2ntul provine din cuvintele grecesti \u201eKrypto\u201d care \u00eenseamn\u0103 &#8220;ascuns&#8221; \u015fi \u201eGrafo\u201d, care \u00eenseamn\u0103 &#8220;a scrie&#8221;. Cei mai mul\u021bi oameni echivaleaz\u0103 criptografia cu criptarea. Criptarea este procesul de conversie a textului clar \u00een text cifrat. Desi criptarea este cu siguran\u021b\u0103 una dintre cele mai comune utiliz\u0103ri ale criptografie, aceasta nu este singurul lucru care se utilizeaz\u0103 pentru chei \u015fi algoritmi. Principalele elemente ale criptografie pe care le voi prezenta \u00een acest capitol sunt:<\/div>\n<p>Cifrurile bloc &#8211; de exemplu, Cipher Block Chaining (CBC)<br \/>\nAlgoritmi cu cheie simetric\u0103 &#8211; de exemplu, AES si 3DES<br \/>\nAlgoritmi cu cheie public\u0103 &#8211; de exemplu, rural service area (RSA)<br \/>\nCertificate &#8211; de exemplu, certificate X.509<br \/>\nMesaje rezumate \u2013 de exemplu secure hash algorithm-1 (SHA-1) si (MD5)<br \/>\nSemn\u0103turile digitale &#8211; de exemplu, semn\u0103turile digitale RSA<br \/>\nServiciile de securitate &#8211; de exemplu, SSL<br \/>\nAceste elemente sunt apoi utilizate pentru urm\u0103toarele scopuri (toate acestea sunt relevante \u00een securitatea Oracle):<br \/>\nConfiden\u021bialitatea, cum ne putem asigura c\u0103 sparg\u0103torii de coduri sau un ho\u0163 care sustrage datele wireless nu le poate citi?<br \/>\n\u0130ntegritatea mesajului, cum putem \u015fti c\u0103 un mesaj nu a fost falsificat \u015fi modificat \u00eenainte de a ajunge \u00een baza de date?<br \/>\nAutentificarea &#8211; cum putem \u015fti c\u0103 un mesaj sau o ac\u021biune vine de la o anumit\u0103 persoan\u0103 sau organiza\u0163ie?Criptare, algoritmi de criptare, \u015fi cifruri<\/p>\n<div>Criptarea este procesul de transformare a textului clar \u00eentr-o anumit\u0103 form\u0103 folosind un algoritm pentru a \u00eel face imposibil de citit pentru oricine, cu excep\u021bia celor care posed\u0103 cunostin\u021bele necesare \u00een\u0163elegerii lui.<\/div>\n<div>Exist\u0103 dou\u0103 tipuri de criptografie sau criptare, algoritmi cu cheie simetric\u0103 \u015fi criptografie cu cheie public\u0103. \u00cen criptografia cu cheie simetric\u0103 cele dou\u0103 p\u0103r\u021bi comunic\u0103 partajand aceea\u015fi cheie (ele pot fi diferite, dar pot fi calculate cu usurin\u021b\u0103 una din alta). Aproape toate metodele de criptare \/ decriptare \u00een lume se bazeaz\u0103 pe criptografia cu chei simetrice &#8211; inclusiv toate metodele pe care le foloseste Oracle pentru a cripta datele \u00een tranzit.<\/div>\n<p>Exist\u0103 mul\u0163i algoritmi de cheie simetric\u0103 (sau cifruri). Toate aceste cifruri func\u021bioneaz\u0103 \u00een acelasi mod \u00een ceea ce priveste faptul c\u0103 o cheie de criptare se utilizeaz\u0103 pentru criptarea textului clar pentru a forma un text cifrat \u015fi apoi aceea\u015fi cheie este utilizat\u0103 pentru a decripta textul cifrat \u00een text clar. Exist\u0103 mai multe cifruri pe care le putem alege. Atunci c\u00e2nd utilizam criptarea \u00een cadrul Oracle vom putea alege unul din aceste cifruri:<\/p>\n<p>DES-DES este un algoritm pe care nu ar trebui s\u0103-l folosim niciodat\u0103. DES a fost ales ca standardul oficial american \u00een 1976, c\u00e2nd computerele erau mult mai slabe \u00een ceea ce priveste puterea de procesare. Algoritmul a fost \u00eentotdeauna controversat, are o lungime scurt\u0103 a cheii de 56 de bi\u021bi, \u015fi pentru c\u0103 p\u0103r\u021bile din el sunt clasificate, s-a crezut \u00eentotdeauna c\u0103 US National Security Agency (NSA) a men\u021binut o cale de acces spre acest algoritm. Cu calculatoare de ast\u0103zi se poate sparge DES \u00een aproximativ 24 de ore, deci e bine s\u0103 nu-l utiliz\u0103m niciodat\u0103.<\/p>\n<p>3DES &#8211; triplu DES este un algoritm care a fost \u00een uz pe scar\u0103 larg\u0103 \u015fi este \u00eenc\u0103 &#8211; \u00een special \u00een sectorul financiar. Acesta este considerat a fi un algoritm puternic, dar exist\u0103 algoritmi mai buni in ziua de azi pe care \u00eei putem alege. DES este prea slab din cauza cheii sale scurte de 56 biti, astfel 3DES a evoluat ca o modalitate simpl\u0103 de a consolida criptarea \u00eempotriva atacului de tip \u201ebrute force\u201d. Exist\u0103 dou\u0103 variante. In prima variant\u0103, numit\u0103 EEE, sunt f\u0103cute trei etape de criptare. \u00cen a doua variant\u0103, numit\u0103 EDE, primul pas \u015fi al treilea sunt pasi de criptare, dar al doilea pas este un pas de decriptare (evident, nu cu aceea\u015fi cheie ca primul pas). 3DES fie are o lungime de 168 bi\u021bi a cheii (de trei ori 56 bi\u021bi utilizati \u00een DES) sau 112 bi\u021bi \u00een cazul \u00een care prima \u015fi a treia cheie DES sunt acelea\u015fi.<\/p>\n<p>AES-AES este algoritmul pe care ar trebui s\u0103-l utiliz\u0103m \u00eentotdeauna dac\u0103 avem de ales. AES (cunoscut sub numele de Rijndael ) a fost adoptat ca standard de criptare de catre guvernul Statelor Unite \u00een 2002, dup\u0103 o perioad\u0103 de cinci ani c\u00e2t a durat procesul de analiz\u0103, compara\u021bie \u015fi selec\u021bie. Acesta a fost analizat pe larg \u015fi este utilizat pe scar\u0103 larg\u0103 \u00een toat\u0103 lumea. Dimensiunile cheilor sunt fie 128, 192, sau 256 biti &#8211; adic\u0103 AES128, AES192, AES256 deci optiuni care pot fi selectate atunci c\u00e2nd acestea apar \u00een Oracle.<\/p>\n<p>AES, 3DES, DES toate sunt numite cifruri bloc. Se numesc cifruri bloc, deoarece acestea func\u021bioneaz\u0103 \u00eentotdeauna pe un bloc de date.<\/p>\n<p>Criptografie cu cheie public\u0103<\/p>\n<div>\u00cen criptarea cu cheie simetric\u0103, cele dou\u0103 chei utilizate pentru criptare \u015fi decriptare sunt acelea\u015fi (sau str\u00e2ns legate) \u015fi trebuie s\u0103 ne asiguram c\u0103 ambele p\u0103r\u021bi au aceea\u015fi cheie. \u00cen criptografia cu cheie public\u0103 cheia de criptare este complet diferit\u0103 de cheia de decriptare. C\u00e2nd utilizam criptografia cu cheie publica avem dou\u0103 chei, o cheie public\u0103 \u015fi o cheie privat\u0103. Atunci c\u00e2nd dorim s\u0103 trimitem un mesaj spre o alt\u0103 parte utilizam o cheie public\u0103 pentru a cripta mesajul \u015fi partea care primeste mesajul utilizeaz\u0103 cheia lor privat\u0103 pentru a decripta mesajul. Dac\u0103 utilizam aceea\u015fi cheie folosit\u0103 la criptare pentru a decripta, mesajul pe care \u00eel vom primi va fi un nonsens ( far\u0103 \u00eenteles). Doar cheia privat\u0103 care se potrive\u015fte cheii publice ne va ajuta s\u0103 ob\u0163inem textul \u00een clar din cel criptat. Exist\u0103 o proprietate foarte important\u0103 \u00een matematic\u0103 \u015fi anume c\u0103 criptografia cu cheie public\u0103 se bazeaz\u0103 pe faptul c\u0103 nu se va demonstra existen\u021ba unor perechi de chei, care sunt complementare \u00eentre ele, care pot fi u\u015for generate de un algoritm, c\u0103 nu exist\u0103 nicio cheie de alt\u0103 natur\u0103 care pot fi inversate \u00eentre ele, \u015fi c\u0103 nu se poate calcula una din cealalt\u0103.<\/div>\n<p>Deci criptografia cu cheie public\u0103 nu are o problem\u0103 \u00een a distribui cheia, problem\u0103 care exista \u00een criptografia cu chei simetrice. Dac\u0103 dorim ca un client \u015fi serverul s\u0103 comunice printr-un canal nesigur tot ce trebuie s\u0103 facem este s\u0103 gener\u0103m dou\u0103 perechi de chei public\u0103 \/ privat\u0103 &#8211; o cheie pentru client \u015fi una pentru server.<\/p>\n<p>Cheia public\u0103 nu poate fi utilizat\u0103 pentru a decripta mesajul numai cheia privat\u0103 poate face acest lucru \u015fi cheia privat\u0103 nu poate fi calculat\u0103 din cheia public\u0103. Serverul prime\u015fte mesajul \u015fi \u00eel decripteaz\u0103 folosind cheia sa privat\u0103. Daca vrea s\u0103 trimit\u0103 un r\u0103spuns clientului, ia mesajul \u015fi \u00eel cripteaz\u0103 folosind cheia public\u0103 a clientului. Acest text criptat este trimis pe canalul nesigur \u015fi clientul \u00eel decripteaz\u0103 folosind cheia sa privat\u0103. Clientul \u015fi serverul reu\u015fesc s\u0103 comunice f\u0103r\u0103 s\u0103 partajeze vreun secret.<\/p>\n<div>De ce avem nevoie de criptografia cu chei simetrice?<\/div>\n<div>Motivul este c\u0103, desi criptografia cu cheie public\u0103 rezolv\u0103 \u00eentr-adev\u0103r problema de distribu\u0163ie a cheii, criptarea cu cheie publica este de aproximativ 1000 de ori mai lent\u0103 dec\u00e2t criptarea cu chei simetrice. Acesta este un motiv de ce \u00eenc\u0103 se folose\u015fte criptarea cu cheie simetric\u0103.<\/div>\n<p><!--more--><br \/>\n<strong>Identificarea<\/strong><\/p>\n<div>Procesul securita\u0163ii bazei de date poate fi sintetizat prin urm\u0103toarele trei etape:<\/div>\n<div>\u00cen primul r\u00e2nd, un utilizator prezint\u0103 o identitate \u00een baza de date. De exemplu, introduce numele de utilizator Utilizatorul dovedeste c\u0103 identitatea prezentat\u0103 este valabil\u0103. De exemplu, el furnizeaza o parol\u0103. Parola este verificat\u0103 de c\u0103tre baza de date pentru a determina dac\u0103 aceasta este parola corect\u0103 pentru numele de utilizator prezentat. Presupun\u00e2nd c\u0103 parola este corect\u0103, baza de date presupune ca identitatea poate fi de \u00eencredere. Baza de date va determina, pe baz\u0103 de identitate, ce privilegii \u015fi autoriza\u021bii are utilizatorul. Accesul la date este reglementat de privilegiile utilizatorului \u015fi de autoriza\u021bii.<\/div>\n<div>De obicei, oamenii \u00ee\u015fi petrec majoritatea timpului lor \u015fi fac eforturi pentru a pune \u00een aplicare procesele necesare pentru al treilea pas. Primele dou\u0103 etape sunt importante, deoarece ele formeaz\u0103 temelia securita\u0163ii; avem nevoie de ele pentru a ajunge la pasul trei. Pasul unu este de identificare, iar pasul doi este de autentificare.<\/div>\n<div>Exist\u0103 un fapt adesea trecut cu vederea \u00een proiectarea \u015fi implementarea de solu\u0163ii de securitate \u015fi anume &#8211; securitate nu se poate baza pe anonimat. Deci int\u00e2i trebuie s\u0103 ne identific\u0103m, s\u0103 d\u0103m dovada c\u0103 suntem, de fapt, cine pretindem c\u0103 suntem. Dac\u0103 o aplica\u021bie de baze de date nu \u015ftie cine suntem, nu ne poate acorda autoriza\u021biile sau privilegiile corespunz\u0103toare, se aplic\u0103 controalele de acces necesare.<\/div>\n<p><!--more--><br \/>\n<strong>Metode de identificare<\/strong><\/p>\n<div>Identificarea este procesul specific \u015fi distinct de recunoa\u015ftere clar\u0103 a unei identit\u0103ti (persoan\u0103). \u0130dentificarea este o parte din via\u021ba de fiecare zi. Ne identific\u0103m la locul de munc\u0103, la telefon, prin e-mail, ne identific\u0103m at\u00e2t de mult \u00eenc\u00e2t probabil c\u0103 nici nu ne d\u0103m seama chiar \u015fi atunci c\u00e2nd o facem. \u0130dentificarea vine \u00een multe forme: fotografii cu noi in\u015fine, amprente digitale, num\u0103rul de angajat , num\u0103rul de cont bancar sau a cardului de credit \u015fi desigur, numele nostru de utilizator, toate acestea ne pot reprezenta pe noi \u00een procesul de identificare.<\/div>\n<div>Ast\u0103zi, exist\u0103 mai multe forme de identificare \u015fi multe moduri de a ne identifica. Metodele de identificare se \u00eencadreaz\u0103 \u00een dou\u0103 categorii: utilizatorul furnizeaz\u0103 identitatea \u015fi identificarea realizat\u0103 de tehnologie.<\/div>\n<p><!--more--><br \/>\n<strong>Identificare furnizat\u0103 de utilizator<\/strong><\/p>\n<div>Solicit\u0103 utilizatorului s\u0103 furnizeze propria identitate, este metoda cea mai r\u0103sp\u00e2ndit\u0103 pentru identificarea din ziua de azi. \u00cen majoritatea aplica\u021biilor informatice, identificarea se bazeaz\u0103 pe numele de utilizator. Banca unde avem un cont de exemplu, probabil, \u00eei place s\u0103 ne identifice dup\u0103 num\u0103rul contului nostru. \u00cen toate cazurile, utilizatorul este responsabil pentru furnizarea de informa\u021bii corecte de identificare. Acest lucru este important, deoarece cunoa\u015fterea unei identit\u0103\u0163i valabile ofer\u0103 o anumit\u0103 siguran\u021b\u0103. De exemplu, nu putem retrage bani dintr-un cont bancar care nu exist\u0103. Este pu\u021bin probabil s\u0103 putem s\u0103 ne conectam la baza de date, dac\u0103 nu se poate furniza un nume de utilizator valabil bazei de date. Pentru hackeri care \u00eencearc\u0103 s\u0103 p\u0103trund\u0103 \u00eentr-un sistem, un bun punct de plecare este s\u0103 ob\u021bin\u0103 o list\u0103 de utilizatori valabil\u0103 pe sistem. Numele de utilizator &#8220;Administrator&#8221; implic\u0103 privilegii mari \u015fi prin urmare, este o \u021bint\u0103 de atac mai valoroasa pentru un hacker dec\u00e2t un nume mai neutru, cum ar fi &#8220;Utilizator 123.&#8221; care are privilegii mai reduse. Cu toate acestea, proiectarea \u015fi punerea \u00een aplicare a securita\u0163ii bazate exclusiv pe cunoa\u015fterea identificatorului de exemplu, un nume de utilizator sau num\u0103rul de cont este riscant\u0103, deoarece acesta poate fi relativ usor de ghicit sau de a ob\u021bine o identitate valabil\u0103 din alt\u0103 surs\u0103.<\/div>\n<p>Avantajul de a folosi identificarea furnizat\u0103 de utilizator este c\u0103 identificatorul (de exemplu, numele de utilizator) este, \u00een general, flexibil. Acest lucru permite administratorilor s\u0103 creeze identificatori intuitivi, care sunt usor de reamintit pentru utilizatori. De exemplu, un nume de utilizator poate fi creat pe baza primei initiale a numelui persoanei \u015fi prenumele, dar acest beneficiu este o sl\u0103biciune. Identificatorii, care pot fi ghiciti cu usurin\u021b\u0103 pot sl\u0103bi securitatea global\u0103.<\/p>\n<p><!--more--><br \/>\n<strong>Identificare realizat\u0103 prin tehnologie<\/strong><\/p>\n<div>Tehnologia ofer\u0103, de asemenea, o varietate de moduri de a ne identifica, inclusiv date biometrice, identitatea calculatorului, \u015fi identit\u0103\u021bile digitale.<\/div>\n<p><strong>Tehnologia biometric\u0103<\/strong><\/p>\n<div>O tehnologie \u00een continu\u0103 crestere \u015fi interesant\u0103 care vine \u00een sprijinul modalita\u0163ii de identificare a utilizatorului este tehnologia biometric\u0103. Biometria se refera la caracteristicile biologice ale oamenilor, care pot fi m\u0103surate pentru a distinge diferen\u021bele dintre ace\u015ftia. Putem utiliza datele biometrice \u00een mod constant pentru a identifica persoane. Creierul nostru folose\u015fte recunoa\u015fterea facial\u0103, c\u00e2nd vedem persoane familiare \u015fi recunoa\u015ftem vocea atunci c\u00e2nd r\u0103spundem la un apel telefonic de la o persoan\u0103 pe care o cunoa\u015ftem.<\/div>\n<p>Mai multe companii \u00een prezent \u00eencearc\u0103 s\u0103 aduc\u0103 la maturitate diverse tehnologii biometrice. Recunoa\u015fterea facial\u0103, scanerea irisului, geometria m\u00e2inii, \u015fi cititoare de amprente sunt printre cele mai populare. Datele biometrice sunt ideale din multe puncte de vedere. Utilizatorii nu le pot uita, \u015fi aceste date pot fi aproape imposibil de ghicit. Furtul p\u0103r\u021bii biometrice este pu\u021bin probabil\u0103, dar exist\u0103 un risc asociat cu reprezentarea digital\u0103 biometric\u0103 care poate fi furat\u0103. Confuzia referitoare la cum sunt utilizate datele biometrice este frecvent\u0103. Acest lucru se datoreaz\u0103 faptului c\u0103 datele biometrice pot fi folosite at\u00e2t pentru identificare c\u00e2t \u015fi \u00een procesele de autentificare. Cu identificarea biometric\u0103, informa\u0163iile biometrice sunt considerate unice \u015fi pot fi utilizate pentru a identifica cu exactitate persoana care prezint\u0103 aceste date biometrice. Acest mod de identificare difer\u0103 de identificarea furnizat\u0103 de utilizator, deoarece utilizatorul nu va spune sistemului cine este, sistemul \u00eel identific\u0103 \u00een mod automat. De re\u021binut un lucru, aceasta nu este autentificare, aceasta este doar identificarea, autentificarea biometrica este procesul de comparare a semn\u0103turii, datele biometrice, cu o referin\u021b\u0103 pentru a dovedi sau infirma o identitate.<\/p>\n<p><!--more--><br \/>\n<strong>Identitatea calculatorului<\/strong><\/p>\n<div>\u00cen mediu de calcul, identitatea se poate baza pe alte elemente non-standard, cum ar fi numele computerului, adresa de re\u021bea fizic\u0103 (de exemplu, adresa MAC identificator unic pe cardul de re\u021bea pentru calculator), adresa de re\u021bea logic\u0103 (adresa IP), sau alte dispozitive care poate fi aplicate la un calculator. Adresele IP \u015fi domenii de IP sunt utilizate \u00een cadrul arhitecturii de securitate destul de frecvent. Adresei respective sau domeniului fie \u00eei este permis accesul fie nu.<\/div>\n<p>Firewall-urile \u015fi diverse tehnologii securizate de rutare sunt puternic dependente de adrese MAC \u015fi adresele IP. Servere de aplica\u021bii \u015fi bazele de date securitate pot utiliza, de asemenea, adresele IP pentru a ajuta la furnizarea de straturi suplimentare de securitate.<\/p>\n<p><!--more--><br \/>\n<strong>Identit\u0103\u0163i digitale<\/strong><\/p>\n<div>O alt\u0103 form\u0103 r\u0103sp\u00e2ndit\u0103 de identificare este prin intermediul reprezent\u0103rii digitale sau identit\u0103\u021bilor digitale. Un exemplu vazut azi e certificatul digital utilizat ca parte a infrastructurilor de chei publice (PKI). PKI ofer\u0103 mai multe capabilit\u0103\u021bi de securitate, inclusiv identificarea, autentificarea \u015fi criptarea. Pentru identificare PKI utilizeaz\u0103 certificate digitale bazate pe un format standard cunoscut sub numele de X.509. Entit\u0103\u021bile, de obicei, utilizatorii de calculatoare sau servere, primesc certificate digitale unice care reprezint\u0103 identitatea lor. Certificatele includ informa\u021bii descriptive despre entitate, cum ar fi numele lor, num\u0103rul de angajat, organizarea, \u015fi loca\u021bia.<\/div>\n<p>Ne putem g\u00e2ndi la un certificat ca la un pa\u015faport digitalizat. Identit\u0103\u021bile digitale sunt bine definite, at\u00e2t structural c\u00e2t \u015fi semantic, \u015fi sunt consecvente \u00een toate aplica\u021biile \u015fi platforme care accept\u0103 standardele certificate. Acest ultim punct este esen\u021bial pentru asigurarea interoperabilit\u0103\u021bii \u00eentre aplica\u021biile \u015fi produsele oferite de c\u0103tre diferi\u0163i furnizori. Certificatele digitale sunt populare, nu numai pentru c\u0103 certificatele sunt bazate pe standarde, dar \u015fi pentru c\u0103 certificatele con\u021bin informa\u021bii suplimentare care pot fi utilizate \u00een punerea \u00een aplicare a controalelor de securitate eficiente. Pentru identificarea utilizatorului, certificatele digitale sunt de obicei instalate \u00een browserele Web ale utilizatorului. Ele pot fi, de asemenea, integrate \u00een dispozitivele fizice, cum ar fi cardurile inteligente. Pentru a securiza identitatea digital\u0103, utilizatorul poate fi obligat s\u0103 furnizeze un cod PIN sau o parol\u0103 pentru deblocarea certificatului.<\/p>\n<div>Una dintre provoc\u0103rile pentru punerea \u00een aplicare a securit\u0103\u021bii eficiente implic\u0103 asigurarea identit\u0103\u021bilor. \u00cen cazul \u00een care securitatea se bazeaz\u0103 pe identificarea corect\u0103, atunci este firesc s\u0103 tragem concluzia c\u0103 aceast\u0103 verig\u0103 \u00een procesul de securitate prezinta un grad sporit de risc. Daca compromitem procesul de identitate, am \u015fi compromis integritatea \u015fi securitatea aplicatiei bazei de date, sau ambele.<\/div>\n<p><!--more--><br \/>\n<strong>Falsificarea<\/strong><\/p>\n<div>O modalitate deosebit de eficient\u0103 \u015fi care are succes pentru a \u00eenvinge o bun\u0103 securitate este de a dejuca securitatea. \u00cen loc de a \u00eencerca s\u0103 dep\u0103sim controalele de acces \u015fi de a evita auditarea, se poate pretinde c\u0103 suntem altcineva dec\u00e2t ceeia ce suntem. Deghizat ca un alt utilizator, sau falsificarea, este echivalentul digital al furtului de identitate. Acest \u201ealtcineva&#8221; poate fi un utilizator privilegiat sau doar un alt utilizator. \u00cen ambele cazuri, falsificarea poate duce la rezultate dezastruoase. Prin intermediul falsific\u0103rii, securitatea sistemului poate deveni un aliat pentru atacator. De exemplu, este posibil s\u0103 nu fie chiar a\u015fa de dificil de a copia sau fura un certificat digital care nu este corect securizat. Certificatele digitale, care pot ac\u021biona ca identita\u0163i digitale, sunt mici (aproximativ 10KB) \u0219i pot fi usor stocate pe mai multe dispozitive, cum ar fi dischete, drive-uri USB, etc. Dac\u0103 certificatul este furat, acesta poate fi apoi folosit pentru a falsifica identitatea \u015fi autentificarea unui utilizator. Arhitectura de securitate a re\u021belei poate include firewall-uri, criptarea de re\u021bea \u015fi sisteme de detectare a intru\u015filor, dar niciunul nu poate detecta ac\u021biunile de falsificare \u00een curs de desf\u0103\u015furare. Acest lucru, \u00een general, se \u00eent\u00e2mpl\u0103 doar \u00een cazul \u00een care certificatul nu este asigurat de c\u0103tre un alt factor, cum ar fi o parol\u0103 puternic\u0103 sau codul PIN.<\/div>\n<p>Retragerea certificatului, care exist\u0103 \u00een aproape toate aplica\u021biile care accept\u0103 certificate digitale, rezolv\u0103 utilizarea ilicit\u0103 a certificatelor digitale, dar numai atunci c\u00e2nd utilizatorul sau administratorul devine constient de faptul c\u0103 furtul a avut loc.<\/p>\n<div>Exist\u0103 nenum\u0103rate moduri de a falsifica \u015fi a pretinde c\u0103 suntem altcineva, dar ideea principala este ca identitatea utilizatorului este esen\u021bial\u0103 pentru procesul de securitate. Garantarea ca identitatea este securizata printr-o autentificare corespunz\u0103toare, implementarea \u015fi monitorizarea este esen\u021bial\u0103 pentru a asigura o securitatea eficient\u0103.<\/div>\n<p><!--more--><br \/>\n<strong>Furtul de identitate<\/strong><\/p>\n<div>Furtul de identitate este o problem\u0103 tot mai mare care afecteaz\u0103 lumea de ast\u0103zi. \u00cen termeni simpli furtul de identitate este pur \u015fi simplu utilizarea abuziv\u0103 \u015fi declara\u021bii false de informa\u021bii asociate cu un singur individ pentru beneficiul altuia. Aceast\u0103 circumstan\u021b\u0103 nefericit\u0103 s-a intensificat \u00een ultimii ani din numeroase motive. Protejarea identit\u0103\u021bii utilizatorului poate fi la fel de important\u0103 ca \u015fi protejarea datelor de identitate a persoanei respective prin care se ob\u0163ine accesul. Cunosc\u00e2ndu-se chiar \u015fi pu\u0163ine date precum un num\u0103r de identificare a unei persoane \u015fi data ei de na\u015ftere de exemplu, cineva poate fi \u00een m\u0103sur\u0103 s\u0103 fure o identitate pentru a deschide un cont bancar nou, s\u0103 aplice pentru \u00eemprumuturi, s\u0103 cumpere diverse lucruri scumpe, sau s\u0103 fac\u0103 nenum\u0103rate alte activit\u0103\u021bi ilegale, sub pretextul de a fi altcineva decat este \u00een realitate.<\/div>\n<p>Deoarece o mul\u021bime de informa\u021bii care pot fi utilizate pentru a crea identit\u0103\u021bi false sunt deturnate din bazele de date \u015fi aplica\u021bii prost concepute. Alegerea necorespunz\u0103toare a unui element de identificare ar putea fi un catalizator pentru furtul de identitate. S\u0103 ne uit\u0103m la o structur\u0103 de tabel posibil\u0103 ca s\u0103 vedem ce riscuri exist\u0103.<\/p>\n<p>CREATE TABLE CLIENTI (Nume VARCHAR2(50),<br \/>\nPrenume VARCHAR2(50),<br \/>\nNr_identif_client VARCHAR2(11),<br \/>\nZi_nastere DATE);Datele din acest tabel sunt \u00een mod clar importante (sensibile). Protejarea accesului la datele din acest tabel este o cerin\u021b\u0103 de securitate evident\u0103. La prima vedere nu exist\u0103 un risc de securitate chiar at\u00e2t de evident \u015fi din acest motiv nu este neobi\u015fnuit \u015fi anume ca un proiectant de aplica\u021bii de baze de date s\u0103 utilizeze \u201eNr_identif_client\u201d ca un identificator al clientului. Acest lucru este foarte riscant \u015fi considerat a fi o decizie foarte proast\u0103. Motivul este faptul c\u0103 identificatorii clien\u0163ilor sunt uneori necesari dezvoltatorilor de aplica\u021bii pentru testare sau depanare, sau pentru verificarea accesului la baza de date de c\u0103tre administratorii bazei de date.<\/p>\n<div>Astfel, exist\u0103 un risc semnificativ ca numarul de identificare al clientului \u015fi numele sau data de na\u015ftere s\u0103 fie folosite neadecvat, scrise pe o h\u00e2rtie \u015fi l\u0103sate pe birou, sau expediate pe e-mail \u00eentr-o manier\u0103 nesigur\u0103. Acest lucru ar putea conduce la dezv\u0103luirea neinten\u021bionat\u0103 de informa\u021bii importante (sensibile). Acesta este tipul de practici, care pot duce la furtul de identitate. Deci ar trebui s\u0103 evalu\u0103m \u015fi s\u0103 m\u00e2nuim cu grija identit\u0103tile pe care le utiliz\u0103m \u015fi s\u0103 ne asigur\u0103m c\u0103 informa\u0163iile confiden\u0163iale nu sunt folosite pentru a reprezenta identitatea clientului.<\/div>\n<p><!--more--><br \/>\n<strong>Autentificarea<\/strong><\/p>\n<div>Prezent\u00e2nd o identitate unui sistem informatic este din punct de vedere tehnic tot ceea ce este necesar pentru ca sistemul s\u0103 acorde autoriza\u021biile corespunzatoare, s\u0103 impun\u0103 controlul accesului \u015fi auditul. Dar este bine ca, o identitate, \u00een general, s\u0103 fie \u00eenso\u0163it\u0103 de altceva care dovede\u015fte c\u0103 identitatea persoanei este legitim\u0103. Pentru ca o identificare s\u0103 se execute cu succes, trebuie s\u0103 existe un proces pentru a dovedi c\u0103 o persoan\u0103 este cea care pretinde a fi, iar acest proces este denumit autentificare.<\/div>\n<p><!--more--><br \/>\n<strong>Metode de autentificare<\/strong><br \/>\nMetodele de autentificare se \u00eencadreaz\u0103 \u00een urm\u0103toarele trei categorii:<\/p>\n<div>Ceva ce stim, cum ar fi de exemplu o parol\u0103 sau un num\u0103r de identificare personal\u0103 (PIN). Parolele sunt metoda de autentificare cea mai comun\u0103 pentru sistemele informatice, deoarece acestea sunt, \u00een general, u\u015for de implementat \u015fi \u00eentretinut.<\/div>\n<div>Ceva de ce dispunem, cum ar fi un certificat X.509, un card inteligent, o cheie de ma\u015fin\u0103, un card de credit, sau o cheie de licen\u021b\u0103 software. Uneori, autentificarea este doar pentru a dovedi c\u0103 suntem o entitate legitim\u0103, cum ar fi un card de acces \u00eentr-o cl\u0103dire care dovede\u015fte c\u0103 suntem un angajat sau o cheie de licen\u021b\u0103 care dovede\u015fte c\u0103 suntem persoana sau entitatea care am pl\u0103tit pentru software-ul respectiv.<\/div>\n<div>Datele biometrice, amprentele digitale, recunoa\u015ftere facial\u0103, scanarea irisului, \u015fi poate \u00eentr-o zi ADN-ul va fi utilizat pentru autentificarea oamenilor.<\/div>\n<p>Autentificare puternic\u0103, de obicei, implic\u0103 faptul c\u0103 autentificarea nu poate fi usor de ghicit sau falsificat. Tehnologiile de autentificare au diferite abilit\u0103\u021bi pentru a \u00eendeplini sarcinile lor de autentificare. Unul dintre criterile pentru determinarea complexit\u0103tii de autentificare este de exemplu, c\u00e2t de greu este s\u0103 se falsifice metoda de autentificare.<\/p>\n<p>Ceva ce noi suntem \u015fi ceva ce noi avem (posed\u0103m) sunt considerate forme mai puternice de autentificare dec\u00e2t ceva ce noi stim. Parolele pot fi ghicite \u015fi prin urmare, sunt considerate metode de autentificare slab\u0103. Falsificarea unui certificat X.509 (ceva ce avem) sau duplicarea datelor biometrice (ceva ce avem), nu este la fel de usor de falsificat ca \u015fi ceeia ce \u015ftim (parolele). Prin urmare, certificatele digitale, autentific\u0103ri biometrice sunt considerate metode puternice de autentificare.<\/p>\n<p>Nu vreau aici s\u0103 sugerez c\u0103 parolele nu ar trebui s\u0103 fie utilizate pentru autentificare. Putem de exemplu, \u00een calitate de administrator de baze de date, s\u0103 ne asigur\u0103m c\u0103 utilizatorii bazei de date folosesc parole puternice prin implementarea unei rutine \u00een care se utilizeaz\u0103 parole de complexitate mare \u015fi un profil de parol\u0103.<\/p>\n<p><!--more--><br \/>\n<strong>Cele mai bune practici de autentificare securizat\u0103. Criptarea autentificatorilor.<\/strong><\/p>\n<div>Criptarea este un instrument important pentru securizarea autentificatorilor. De exemplu, s\u0103 presupunem ca un utilizator se autentific\u0103 cu o amprent\u0103. Dac\u0103 amprenta este trecut\u0103 printr-un canal necriptat de re\u021bea, o persoana r\u0103u inten\u0163ionat\u0103 cu un program de tip detector de re\u021bea ar putea \u00eenregistra identitatea utilizatorului \u015fi amprente digitale. Mai t\u00e2rziu, acea persoana r\u0103u intentionat\u0103 ar putea reda sau s\u0103 prezinte identitatea capturat\u0103 \u015fi amprenta digital\u0103, astfel falsific\u00e2nd cu succes utilizatorul ini\u021bial. Cu criptare de re\u021bea, o nou\u0103 cheie este utilizat\u0103 pentru fiecare sesiune de comunicare. Cheia care a fost capturat\u0103 \u015fi folosit\u0103 \u00een prima sesiune nu mai poate fi refolosit\u0103 mai tarziu. Refolosind o captur\u0103 a unor date biometrice criptate care au fost capturate nu vor func\u021biona folosind criptarea standard de re\u021bea, cum ar fi SSL. Autentificatorii au un risc mare, deoarece acestea adesea traverseaz\u0103 re\u021belele de calculatoare. Criptarea traficul de re\u021bea este o ap\u0103rare bun\u0103 \u00eempotriva copierii autentificatorilor. Criptarea \u00eentregului flux de re\u021bea asigur\u0103 o securitate optim\u0103. Criptarea protejeaz\u0103 nu numai autentificatorii, dar, de asemenea protejeaz\u0103 \u015fi identit\u0103\u0163ile utilizatorilor, interog\u0103rile acestora, precum \u015fi rezultatele returnate.<\/div>\n<p>Asigurarea securit\u0103\u021bii pentru stocarea autentificatorilor este la fel de important\u0103. Adesea, autentificatorii vor fi p\u0103stra\u0163i \u00eentr-o form\u0103 criptat\u0103 pentru a p\u0103stra confiden\u021bialitatea autentificatorului.<\/p>\n<p><!--more--><br \/>\n<strong>Abrevierea (prescurtatea) autentificatorilor<\/strong><\/p>\n<div>Atunci c\u00e2nd sunt utilizate parole pentru autentificare, parolele nu ar trebui s\u0103 fie stocate \u00een text clar. Criptarea pare a fi solu\u021bia optim\u0103, dar nu este. Criptare, este procesul de conversie a textului \u00een clar \u00een text indescifrabil, dar implic\u0103 decriptarea, care este procesul de conversie a textului indescifrabil \u00eenapoi \u00een text clar.<\/div>\n<p>Criptarea parolelor, care permite o probabil\u0103 decriptarea a acestora, ar putea ob\u0163ine parolele \u00een text clar. Pentru a rezolva acest\u0103 problem\u0103, se poate utiliza o tehnologie numit\u0103 abrevierea sau prescurtarea parolelor. Prin intermediul abrevierii textul \u00een clar se converte\u015fte \u00een text indescifrabil. Spre deosebire de criptare, nu exist\u0103 nicio modalitate de a ob\u0163ine \u00eenapoi textul \u00een clar. Deci, nu exist\u0103 nici o modalitate de a lua o valoare \u00een forma abreviat\u0103 \u015fi apoi s\u0103 determin\u0103m ce a creat aceast\u0103 valoare. Abrevierea este numit\u0103 o func\u021bie unidirec\u021bional\u0103 din cauza acestei propriet\u0103\u0163i. O alt\u0103 proprietate important\u0103 a abrevierii este faptul c\u0103 aceea\u015fi intrarea va genera \u00eentotdeauna aceea\u015fi ie\u015fire. Autentificarea prin parol\u0103 are loc prin abrevierea parolei \u015fi stocarea rezultatului \u00eentr-o valoare trunchiat\u0103 sau abreviat\u0103. Atunci c\u00e2nd utilizatorul introduce o parol\u0103 pentru autentificare, valoarea autentificarii furnizate de utilizator (a parolei), va fi comparat\u0103 prin intermediul procesului de autentificare cu valoarea abreviat\u0103 stocat\u0103. Dac\u0103 valoarea trunchiat\u0103 sau abreviat\u0103 se potriveste, atunci intrarea trebuie de asemenea sa se potriveasc\u0103 \u015fi prin urmare parolele sunt acelea\u015fi. Modalitatea de abreviere poate fi folosit\u0103 pentru al\u021bi autentificatori \u00een acela\u015fi mod.<\/p>\n<div>Din moment ce autentificatorii nu se folosesc pentru activit\u0103\u021bi cum ar fi sortarea, calcule cumulate \u015fi a\u015fa mai departe, abrevierea este o solu\u021bie bun\u0103 pentru stocarea datelor de autentificare. Abrevierea cu cheie, care presupune o criptare a valorii abreviate, este adesea o alternativ\u0103 mai bun\u0103 dec\u00e2t abrevierea de baz\u0103, at\u00e2t timp c\u00e2t cheia poate fi protejat\u0103.<\/div>\n<p><strong>Baza de date<\/strong><\/p>\n<div>Un mecanism primar al unei baze de date este numele de utilizator \u015fi parola. Autentificarea este critic\u0103, deoarece numele de utilizator poate fi ghicit \u015fi \u00een unele cazuri, sunt bine cunoscute. Pentru utilizatorii identifica\u021bi \u00een baza de date avem urm\u0103toarele op\u021biuni de autentificare:<\/div>\n<p>Parolele: Parolele pot fi fie autentificate de c\u0103tre baza de date sau de catre Oracle LDAP<br \/>\nOracle suport\u0103 autentificarea sistemului de operare \u015fi autentific\u0103ri puternice, care includ certificate PKI, Kerberos, DCE \u015fi RADIUS. Standardul RADIUS extinde capacit\u0103\u021bile de autentificare pentru a include elementele biometrice integrate, \u015fi carduri inteligente.<strong>Asocierea utilizatoriilor cu schemele bazelor de date<\/strong><\/p>\n<div>Atunci c\u00e2nd se pune problema construirii de aplica\u0163ii, exist\u0103 de obicei trei modele care pot fi folosite pentru cartografierea utilizatorilor finali la conturile de baze de date. Exist\u0103 diferite beneficii \u015fi riscuri \u00een cadrul fiec\u0103rui model, a\u015fa c\u0103 este important s\u0103 in\u0163elegem fiecare model. Aceast\u0103 \u00een\u021belegere este crucial\u0103, deoarece modelul de multe ori limiteaz\u0103 ceea ce facem \u015fi cum o facem.<\/div>\n<p>1:1 Aceast\u0103 schem\u0103 <strong>\u201eunu-la-unu \u201e<\/strong> se produce \u00een principal \u00een programe client-server. Acest lucru \u00eenseamn\u0103 c\u0103 fiecare utilizator final are un cont distinct bazei de date.<br \/>\nN: M Acesta schem\u0103 <strong>\u201etotii-la-mai-multi\u201d<\/strong> se \u00eent\u00e2mpl\u0103 ocazional \u00een aplica\u021bii Web. Aceasta \u00eenseamn\u0103 c\u0103 to\u021bi utilizatorii finali sunt mapa\u0163i la mai multe scheme diferite. To\u021bi utilizatorii cu acelea\u015fi privilegii sunt conecta\u0163i la aceea\u015fi schem\u0103.<br \/>\nN: 1 Acest\u0103 schem\u0103 <strong>\u201etoti-la-unul\u201d<\/strong> este o aplica\u021bie Web tipic\u0103. Aplica\u021bia conecteaz\u0103 to\u021bi utilizatorii finali la aceea\u015fi schem\u0103 a bazei de date. Schema dispune de o uniune a tuturor privilegiilor pentru to\u0163i utilizatorii conecta\u0163i la ea.Schema sau maparile sunt enumerate \u00een ordine de la simplu la complex pentru a construi securitatea bazei de date. Exist\u0103 mai mul\u021bi factori care influen\u021beaz\u0103 alegerea modelului. Scalabilitatea, performan\u0163a \u015fi administrarea u\u015for de folosit ne solicit\u0103 de multe ori cea mai mare aten\u021bie. Securitatea \u00eens\u0103 trebuie s\u0103 fie de asemenea un aspect care trebuie avut \u00een vedere.<\/p>\n<p><!--more--><br \/>\n<strong>Privilegiile utilizatorului pentru conturile unice \u00een baza de date.<\/strong><\/p>\n<div>\u00cen func\u021bie de cum va fi accesat\u0103 baza de date \u015fi rolul aplica\u0163iilor s-ar putea sau nu s\u0103 avem o mul\u021bime de conturi reale de utilizatori finali. Schema (maparea) 1:1 poate avea loc \u00een mai multe moduri, dar ideea este c\u0103 exist\u0103 o mapare direct\u0103 a fiec\u0103rui utilizator la o identitate \u00een baza de date (acesta este, contul bazei de date). \u00cen modul cel mai simplu, utilizatorul furnizeaz\u0103 un nume de utilizator \u0219i o parol\u0103, care sunt efectiv numele de utilizator \u015fi parola contului bazei de date. Alternativ, aplica\u0163ia ar putea furniza propria mapare. Atunci c\u00e2nd cre\u0103m conturi bazei de date de tipul 1:1, este important s\u0103 aplicam acelea\u015fi minime privilegii utilizate \u00een conturile de gestionare pe sisteme de operare. Deci, ar trebui s\u0103 cre\u0103m utilizatorii f\u0103r\u0103 privilegii \u0219i apoi s\u0103 le acord\u0103m selectiv privilegiile de care au nevoie pentru a putea s\u0103 execute \u00een baza de date serviciul sau cererea de care au nevoie. Aceast\u0103 schem\u0103 este deosebit de important\u0103 pentru administratorii de baze de date \u0219i pentru al\u0163i utilizatori privilegia\u0163i.<\/div>\n<p>Partajarea unui cont privilegiat printre un grup de utilizatori este o practic\u0103 proast\u0103. \u00cen multe organiza\u021bii, schimbul de conturi de utilizator este interzis\u0103 de politica de securitate, dar este totu\u0219i \u00eenc\u0103 folosit\u0103 \u015fi se practica de multe ori. Dac\u0103 ceva nu merge bine \u00een acest caz, nu vom fi \u00een m\u0103sur\u0103 s\u0103 spunem care utilizator a fost conectat ca utilizator al bazei de date \u00een momentul \u00een care s-a \u00eent\u00e2mplat ceva. Prin urmare, nu exist\u0103 nicio responsabilitate a utilizatorului. Schema 1:1 face securitatea bazei de date simpl\u0103 pentru c\u0103 identitatea utilizatorului este \u00eentotdeauna disponibil\u0103 pentru baza de date, prin urmare, utilizatorul este responsabil.<\/p>\n<div>\u00cen plus, multe dintre capacit\u0103\u021bile de securitate ale bazei de date func\u021bioneaz\u0103 la nivel de schem\u0103 individual\u0103. Dac\u0103 fiecare utilizator are o schem\u0103 unic\u0103, atunci baza de date poate aplica u\u0219or securitatea corespunz\u0103toare pentru utilizatorii corespunz\u0103tori, bazat\u0103 pe scheme.<\/div>\n<p><!--more--><br \/>\n<strong>Conturi de baze de date partajate<\/strong><\/p>\n<div>Privilegiile minime sunt importante, chiar dac\u0103 utilizatorii nu sunt conecta\u021bi direct la baza de date. Este o practic\u0103 frecvent\u0103 pentru utilizatori s\u0103 aib\u0103 un cont unic de aplica\u021bie \u0219i s\u0103 partajeze o schem\u0103 de baze de date. Exist\u0103 dou\u0103 scheme pentru aceasta. \u00cen primul r\u00e2nd schema N: M, parti\u021bioneaza utilizatorii \u00een diverse scheme. Acest lucru se face \u00een general prin organizarea utilizatorilor dup\u0103 rolul lor, to\u0163i utilizatorii cu acela\u015fi rol se conecteaz\u0103 la aceea\u015fi schem\u0103. Partea important\u0103 este s\u0103 ne asiguram c\u0103 \u00een principiu cele mai pu\u021bine privilegii sunt \u00eenc\u0103 men\u021binute. Putem face \u00een mod eficient acest lucru, dac\u0103 to\u0163i utilizatorii care se ataseaz\u0103 la schema bazei de date s\u0103 aib\u0103 exact acelea\u015fi privilegii \u00een baza de date. Transmiterea identit\u0103tii utilizatorului este important\u0103 \u00een acest model, deoarece baza de date poate fi \u00een imposibilitatea de a distinge \u00eentre utilizatorii racorda\u021bi la aceea\u015fi schem\u0103.<\/div>\n<p>Modelul de schem\u0103 N: 1, conecteaz\u0103 to\u021bi utilizatorii finali la aceea\u015fi schem\u0103 a bazei de date. Aceast\u0103 schem\u0103 este \u00eentotdeauna cea mai \u00eendoielnic\u0103 \u00een ceea ce priveste securitatea. Problema cu proiectarea este faptul c\u0103 e dificil pentru baza de date s\u0103 separe privilegiile de securitate pentru utilizatori diferi\u021bi, deoarece to\u021bi sunt conecta\u0163i la aceea\u015fi schem\u0103. Garantarea c\u0103 numai privilegiile potrivite sunt disponibile pentru utilizator este l\u0103sat\u0103 \u00een cea mai mare parte apliacatiei. C\u00e2nd proiectam \u015fi construim aplica\u021bii, trebuie s\u0103 ne asiguram c\u0103 este mentinut principiul cu privilegii minime. Proprietarul datelor are toate privilegiile asupra datelor. \u00cen cazul \u00een care utilizatorii se conecteaz\u0103 la aceast\u0103 schem\u0103, chiar dac\u0103 prin intermediul aplica\u021biei noastre exista un risc semnificativ de penetrare a securit\u0103\u0163ii sistemului. Aceasta se poate \u00eentampla, \u00een cazul \u00een care un utilizator poate sparge aplica\u0163ia, utilizatorul va avea control complet pe partea datelor. Din acest motiv, o practic\u0103 mai bun\u0103 de securitate este s\u0103 ne asigur\u0103m c\u0103 utilizatorii aplica\u021biei nu se pot conecta direct la contul de date.<\/p>\n<div>Deci ca o concluzie putem spune c\u0103 nu trebuie niciodat\u0103 s\u0103 permitem utilizatorilor finali s\u0103 se conecteze la schemele de date.<\/div>\n<p>Un aspect important al procesului de identificare este p\u0103strarea identit\u0103\u021bii. Noi trebuie s\u0103 ne asigur\u0103m c\u0103 identit\u0103\u021bile de utilizator sunt disponibile peste tot unde securitatea le solicit\u0103.<\/p>\n<div>Se \u00eent\u00e2mpl\u0103 adesea c\u0103 utilizatorul se autentific\u0103 la o aplica\u021bie, iar aplica\u0163ia se conecteaz\u0103 la baza de date nu ca utilizator de drept (real), ci ca anonim sau pseudo-anonim. La proiectarea aplica\u021biilor de baze de date, mai multe informa\u021bii cu privire la identitatea utilizatorului ne pot oferi nivelurile mai subtile de securitate care se pot aplica. De\u015fi multe aplica\u021bii (sau baze de date) sunt concepute \u00een jurul valorii de control al accesului la nivel de utilizator \u015fi de audit, acest lucru nu este tot ce ar fi necesar. Aproape toate aplica\u021biile sunt bazate pe identificarea utilizatorilor \u00een sine sau ca membri ai unui grup. \u0130dentificarea \u015fi autentificarea formeaz\u0103 temelia proceselor de securitate. Acestea trebuie s\u0103 fie puse \u00een aplicare \u00een primul r\u00e2nd \u015fi trebuie s\u0103 fie facute corect. P\u0103strarea identit\u0103\u021bii utilizatorului la baza de date permite utilizarea bazei de date \u00een sigurant\u0103, iar aceasta este \u00een conformitate cu principiul securizarii \u00een profunzime. Va trebui s\u0103 luam \u00een calcul proiectarea acestei securita\u0163i \u00een aplica\u021biile noastre dinainte. Modelul de utilizator al bazei de date este important pentru a se prevedea ce capabilit\u0103\u021bi ale bazei de date vor putea fi folosite. Cel pu\u021bin ar trebui s\u0103 separ\u0103m schemele de utilizator \u015fi schemele de date.<\/div>\n<p>Administratorii nu ar trebui s\u0103 partajeze conturi. Schemele de partajare ar trebui s\u0103 fie f\u0103cute doar atunci c\u00e2nd identitatea utilizatorilor finali poate fi p\u0103strat\u0103 \u015fi privilegiile bazei de date sunt identice pentru to\u021bi utilizatorii conecta\u021bi la aceea\u015fi schem\u0103. \u00cen\u021belegerea identific\u0103rii \u015fi autentific\u0103rii este important\u0103 pentru modul \u00een care formul\u0103m politicile noastre de securitate. Trebuie s\u0103 evaluam cu aten\u021bie cerin\u021bele de securitate, valoarea \u015fi importan\u0163a datelor utilizate, administrarea lor, precum \u015fi costurile asociate cu diferite tehnologii de autentificare.<\/p>\n<p><!--more--><br \/>\n<strong>Studiul de caz<\/strong><\/p>\n<div>Exemplele din lucrarea de fat\u0103 se refer\u0103 la proiectarea unui model de date ce ofer\u0103 informa\u0163ii referitoare la eviden\u0163a unui magazin ce are ca activitate \u00eenchirierea de filme c\u0103tre clien\u0163i. Construirea schemei conceptuale, a schemelor rela\u0163ionale, precum \u015fi normalizarea va creea un model de date rela\u0163ional prin intermediul c\u0103ruia se va elimina anumite clase de anomalii ce apar \u00een proiectarea modelului de date din aceast\u0103 lucrare.<\/div>\n<p><strong>Crearea bazei de date<\/strong><br \/>\nPentru a crea baza de date denumit\u0103 \u201cFILM\u201d voi utiliza aplica\u0163ia cu interfa\u0163\u0103 grafic\u0103 Oracle Database XE 11.2. Fereasta de login este aratat\u0103 \u00een figura 9 de mai jos.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_9.png\" alt=\"\" width=\"582\" height=\"169\" \/><\/p>\n<p align=\"center\">Figura 9. Fereastr\u0103 login aplica\u0163ie Oracle Database XE 11.2<\/p>\n<p>Dup\u0103 ce procesul de logare \u00een aplica\u0163ie a avut loc, vom fi directiona\u0163i spre o fereastr\u0103 prin intermediul c\u0103reia putem crea baza noastr\u0103 de date \u201cFILM\u201d. \u00cen aceast\u0103 fereastr\u0103 aplica\u0163ia ne solicit\u0103 s\u0103 alegem crearea unei noi baze de date sau utilizarea unei baze deja existente, numele bazei de date, \u00een cazul nostru alegem \u201cFILM\u201d, numele de utilizator \u015fi parola, apoi facem clic pe Create Workspace. Fereastra prin intermediul careia cre\u0103m baza de date \u201cFILM\u201d este aratat\u0103 \u00een fig.10.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_10.png\" alt=\"\" width=\"577\" height=\"330\" \/><\/p>\n<p align=\"center\">Figura 10. Fereastr\u0103 creare baz\u0103 de date \u201eFILM\u201d<\/p>\n<p>Dup\u0103 ce baza de date a fost creat\u0103 avem acces la interfata grafica a aplica\u0163iei prin intermediul careia putem crea, insera, actualiza \u015fi sterge tabelele \u015fi informa\u0163iile con\u0163inute \u00een baza noastra \u201cFILM\u201d. \u0130nterfa\u0163a grafic\u0103 a aplica\u0163iei este aratat\u0103 \u00een figura 11.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_11.png\" alt=\"\" width=\"634\" height=\"571\" \/><\/p>\n<p align=\"center\">Figura 11. Interfa\u0163a grafic\u0103 aplica\u0163ie Oracle Application Express<\/p>\n<p><strong>Tabelele bazei de date<\/strong><\/p>\n<div>\u00cen baza de date am creat urmatoarele tabele:<\/div>\n<p>FILM_STOC<br \/>\nGEN_FILM<br \/>\nLIMBA_FILM<br \/>\nSUBTITRARE<br \/>\nFILM_LIPSA_STOC<br \/>\nCOPII_FILM<br \/>\nFILME_INCHIRIATE<br \/>\nCLIENTI_INCHIRIERE_FILM<strong>Structura detaliat\u0103 a tabelelor este urm\u0103toarea:<\/strong><\/p>\n<div>FILM_STOC \u2013 tabelul con\u0163ine id-ul filmelor care sunt pe stoc, adica un cod unic ce identific\u0103 fiecare film, acest cod unic este \u201cid_film \u201ccare \u00eempreuna cu c\u00e2mpul \u201ccod_gen_film\u201d reprezint\u0103 \u015fi cheia primar\u0103 a tabelului. Comanda de creare a tabelului este urmatoarea:<\/div>\n<p>CREATE TABLE &#8220;FILM_STOC&#8221;<br \/>\n(&#8220;ID_FILM&#8221; NUMBER NOT NULL ENABLE,<br \/>\n&#8220;COD_GEN_FILM&#8221; VARCHAR2(10) NOT NULL ENABLE,<br \/>\n&#8220;NUME_FILM&#8221; VARCHAR2(50),<br \/>\n&#8220;PRET_VHS&#8221; NUMBER(2,0),<br \/>\n&#8220;PRET_DVD&#8221; NUMBER(2,0),<br \/>\n&#8220;AN_APARITIE&#8221; NUMBER(4,0),<br \/>\nCONSTRAINT &#8220;FILM_STOC_PK&#8221; PRIMARY KEY (&#8220;ID_FILM&#8221;, &#8220;COD_GEN_FILM&#8221;) ENABLE<br \/>\n) ;<\/p>\n<div>GEN_FILM \u2013 tabelul con\u0163ine un cod care identifica genul de filme pe care le de\u0163inem pe stoc. Cheia primar\u0103 este \u201ccod_gen_film \u201c.Comanda de creare a tabelului este urm\u0103toarea:<\/div>\n<p>CREATE TABLE &#8220;GEN_FILM&#8221;<br \/>\n(&#8220;COD_GEN_FILM&#8221; VARCHAR2(6) NOT NULL ENABLE,<br \/>\n&#8220;DESCRIERE_FILM&#8221; VARCHAR2(10),<br \/>\nCONSTRAINT &#8220;GEN_FILM_PK&#8221; PRIMARY KEY (&#8220;COD_GEN_FILM&#8221;) ENABLE<br \/>\n) ;<\/p>\n<div>LIMBA_FILM \u2013 tabelul con\u0163ine informa\u0163ii despre limba original\u0103 a filmelor existente pe stoc. Cheia primar\u0103 a tabelului este o cheie compus\u0103 din c\u00e2mpurile \u201cid_film\u201d \u015fi \u201ccod_limba\u201d. Comanda de creare a tabelului este urmatoarea:<\/div>\n<p>CREATE TABLE &#8220;LIMBA_FILM&#8221;<br \/>\n(&#8220;ID_FILM&#8221; NUMBER NOT NULL ENABLE,<br \/>\n&#8220;COD_LIMBA&#8221; VARCHAR2(6) NOT NULL ENABLE,<br \/>\nCONSTRAINT &#8220;LIMBA_FILM_PK&#8221; PRIMARY KEY (&#8220;ID_FILM&#8221;, &#8220;COD_LIMBA&#8221;) ENABLE<br \/>\n) ;<\/p>\n<div>SUBTITRARE \u2013 tabelul con\u0163ine informa\u0163ii despre limba de subtitrare a filmelor din stoc. Chei primar\u0103 a acestui tabel este o cheie compus\u0103 din campurile \u201c cod_limba\u201d \u015fi \u201cnume_limba\u201d. Comanda de creare a tabelului este urm\u0103toarea:<\/div>\n<p>CREATE TABLE &#8220;SUBTITRARE&#8221;<br \/>\n(&#8220;COD_LIMBA&#8221; VARCHAR2(3) NOT NULL ENABLE,<br \/>\n&#8220;NUME_LIMBA&#8221; VARCHAR2(10) NOT NULL ENABLE,<br \/>\nCONSTRAINT &#8220;SUBTITRARE_PK&#8221; PRIMARY KEY (&#8220;COD_LIMBA&#8221;, &#8220;NUME_LIMBA&#8221;) ENABLE );FILM_LIPSA_STOC \u2013 tabel ce con\u0163ine informa\u0163ii despre filmele care nu sunt disponibile, are un cod unic carte identific\u0103 filmele nedisponibile, cod care este \u015fi cheie primar\u0103 a tabelului. Comanda de creare a tabelului este urm\u0103toarea:<\/p>\n<p>CREATE TABLE &#8220;FILM_LIPSA_STOC&#8221;<br \/>\n(&#8220;ID_LIPSA_FILM&#8221; NUMBER NOT NULL ENABLE,<br \/>\n&#8220;FILM_DENUMIRE&#8221; VARCHAR2(50),<br \/>\n&#8220;FORMAT_SUPORT&#8221; VARCHAR2(3),<br \/>\nCONSTRAINT &#8220;FILM_LIPSA_STOC_PK&#8221; PRIMARY KEY (&#8220;ID_LIPSA_FILM&#8221;) ENABLE<br \/>\n) ;COPII_FILM \u2013 tabel ce con\u0163ine informa\u0163ii despre filmele care au copii, c\u00e2t \u015fi num\u0103rul acestor copii. Cheia primar\u0103 este una compus\u0103 din c\u00e2mpurile \u201cid_film\u201d \u015fi \u201c nr_copii\u201d. Comanda de creare a tabelului este urm\u0103toarea:<\/p>\n<p>CREATE TABLE &#8220;COPII_FILM&#8221;<br \/>\n(&#8220;ID_FILM&#8221; NUMBER NOT NULL ENABLE,<br \/>\n&#8220;NR_COPII&#8221; NUMBER NOT NULL ENABLE,<br \/>\n&#8220;DENUMIRE_FILM&#8221; VARCHAR2(50),<br \/>\n&#8220;FORMAT_MEDIA&#8221; VARCHAR2(3),<br \/>\nCONSTRAINT &#8220;COPII_FILM_PK&#8221; PRIMARY KEY (&#8220;ID_FILM&#8221;, &#8220;NR_COPII&#8221;) ENABLE<br \/>\n) ;FILME_INCHIRIATE \u2013 tabel ce con\u0163ine informa\u0163ii despre filmele \u00eenchiriate clien\u0163ilor. Cheia primar\u0103 este o cheie compus\u0103 din campurile \u201c id_film\u201d \u015fi \u201cid_film_copie\u201d. Comanda de creare a tabelului este urm\u0103toarea:<\/p>\n<p>CREATE TABLE &#8220;FILME_INCHIRIATE&#8221;<br \/>\n(&#8220;ID_FILM&#8221; NUMBER,<br \/>\n&#8220;ID_FILM_COPIE&#8221; NUMBER,<br \/>\n&#8220;DATA_INCHIRIERE&#8221; DATE,<br \/>\n&#8220;TITLU_FILM&#8221; VARCHAR2(50),<br \/>\n&#8220;PRET_INCHIRIERE&#8221; NUMBER,<br \/>\n&#8220;PENALIZARE_INTARZIERE_PIERDERE&#8221; NUMBER,<br \/>\n&#8220;DATA_RETURNARE&#8221; DATE,<br \/>\nCONSTRAINT &#8220;FILME_INCHIRIATE_PK&#8221; PRIMARY KEY (&#8220;ID_FILM&#8221;, &#8220;ID_FILM_COPIE&#8221;) ENABLE<br \/>\n) ;CLIENTI_INCHIRIERE_FILM \u2013 tabel ce con\u0163ine un cod ce identific\u0103 unic fiecare client care a \u00eenchiriat filme , c\u00e2t \u015fi datele personale ale acestora. Codul unic care identific\u0103 clien\u0163ii este \u015fi cheia primar\u0103 a tabelului. Comanda de creare a tabelului este urm\u0103toarea:<\/p>\n<p>CREATE TABLE &#8220;CLIENTI_INCHIRIERE_FILM&#8221;<br \/>\n(&#8220;CLIENT_ID&#8221; NUMBER,<br \/>\n&#8220;NUME&#8221; VARCHAR2(20),<br \/>\n&#8220;PRENUME&#8221; VARCHAR2(20),<br \/>\n&#8220;ADRESA&#8221; VARCHAR2(50),<br \/>\n&#8220;ORAS&#8221; VARCHAR2(16),<br \/>\n&#8220;CNP&#8221; VARCHAR2(13),<br \/>\n&#8220;TEL&#8221; VARCHAR2(10),<br \/>\nCONSTRAINT &#8220;CLIENTI_INCHIRIERE__FILM_PK&#8221; PRIMARY KEY (&#8220;CLIENT_ID&#8221;) ENABLE );<br \/>\n<\/&#038;nbsp><br \/>\n<strong>Inserare date \u00een baza de date<\/strong><\/p>\n<div>Pentru a insera datele corespunzatoare \u00een baza noastr\u0103 de date referitor la filmele pe care le de\u0163inem vom utiliza limbajul SQL, \u015fi anume instruc\u0163iunea INSERT. Codul SQL este urm\u0103torul:<\/div>\n<p>INSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8217;01&#8217;, &#8216;act&#8217;, &#8216;The Matrix&#8217;, &#8217;30&#8217;, &#8217;18&#8217;, &#8216;2001&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8216;4&#8217;, &#8216;com&#8217;, &#8216;You Have Got Mail&#8217;, &#8217;35&#8217;, &#8217;15&#8217;, &#8216;2007&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8216;5&#8217;, &#8216;dra&#8217;, &#8216;Red Corner&#8217;, &#8217;34&#8217;, &#8217;15&#8217;, &#8216;2004&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8216;6&#8217;, &#8216;SF&#8217;, &#8216;Blade Runner &#8211; Director is Cut&#8217;, &#8217;36&#8217;, &#8217;19&#8217;, &#8216;2008&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8216;8&#8217;, &#8216;cart&#8217;, &#8216;A Bug is Life&#8217;, &#8217;32&#8217;, &#8217;14&#8217;, &#8216;2008&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8216;9&#8217;, &#8216;com&#8217;, &#8216;There is Something About Mary&#8217;, &#8217;34&#8217;, &#8217;17&#8217;, &#8216;2003&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8217;10&#8217;, &#8216;dra&#8217;, &#8216;Beloved&#8217;, &#8217;30&#8217;, &#8217;13&#8217;, &#8216;2002&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8216;2&#8217;, &#8216;act&#8217;, &#8216;Under Siege&#8217;, &#8217;28&#8217;, &#8217;17&#8217;, &#8216;2000&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8216;3&#8217;, &#8216;act&#8217;, &#8216;Lethal Weapon&#8217;, &#8217;28&#8217;, &#8217;19&#8217;, &#8216;2006&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_STOC&#8221; (ID_FILM, COD_GEN_FILM, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE) VALUES (&#8216;7&#8217;, &#8216;thril&#8217;, &#8216;Frantic&#8217;, &#8217;37&#8217;, &#8217;20&#8217;, &#8216;2010&#8217;)Tabelul \u201eFILM_STOC\u201d din baza noastr\u0103 de date \u201eFILM\u201d va avea structura \u00een urma inser\u0103rii datelor ca \u00een figura 1.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_1.png\" alt=\"\" width=\"585\" height=\"306\" \/><\/p>\n<p align=\"center\">Figura 1. Con\u0163inut tabel Film Stoc<\/p>\n<p>Pentru a introduce date \u00een tabelul \u201eGEN_FILM\u201d utiliz\u0103m urm\u0103torul cod SQL:<\/p>\n<p>INSERT INTO &#8220;FILM&#8221;.&#8221;GEN_FILM&#8221; (COD_GEN_FILM, DESCRIERE_FILM) VALUES (&#8216;act&#8217;, &#8216;actiune&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;GEN_FILM&#8221; (COD_GEN_FILM, DESCRIERE_FILM) VALUES (&#8216;com&#8217;, &#8216;comedie&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;GEN_FILM&#8221; (COD_GEN_FILM, DESCRIERE_FILM) VALUES (&#8216;dra&#8217;, &#8216;drama&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;GEN_FILM&#8221; (COD_GEN_FILM, DESCRIERE_FILM) VALUES (&#8216;SF&#8217;, &#8216;stiintific&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;GEN_FILM&#8221; (COD_GEN_FILM, DESCRIERE_FILM) VALUES (&#8216;cart&#8217;, &#8216;desene an.&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;GEN_FILM&#8221; (COD_GEN_FILM, DESCRIERE_FILM) VALUES (&#8216;thril&#8217;, &#8216;triller&#8217;)Tabelul \u201eGEN_FILM\u201d va avea structura \u00een urma inser\u0103rii datelor ca \u00een figura 2.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_2.png\" alt=\"\" width=\"269\" height=\"215\" \/><\/p>\n<p align=\"center\">Figura 2. Con\u0163inut tabel Gen Film<\/p>\n<p><!--more--><br \/>\nPentru a introduce date \u00een tabelui \u201eLIMBA_FILM\u201d utiliz\u0103m urm\u0103torul cod SQL:<\/p>\n<p>INSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8216;1&#8217;, &#8216;en&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8216;4&#8217;, &#8216;en&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8216;5&#8217;, &#8216;en&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8216;6&#8217;, &#8216;en&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8216;8&#8217;, &#8216;en&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8216;9&#8217;, &#8216;en&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8217;10&#8217;, &#8216;en&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8216;2&#8217;, &#8216;en&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8216;3&#8217;, &#8216;en&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;LIMBA_FILM&#8221; (ID_FILM, COD_LIMBA) VALUES (&#8216;7&#8217;, &#8216;en&#8217;)Tabelul \u201cLIMBA_FILM\u201d va avea structura \u00een urma inser\u0103rii datelor ca \u00een figura 3.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_3.png\" alt=\"\" width=\"198\" height=\"244\" \/><\/p>\n<p align=\"center\">Figura 3. Con\u0163inut tabel Limba Film<\/p>\n<p>Tabelui \u201eSUBTITRARE\u201d arat\u0103 coresponden\u0163a dintre limba original\u0103 a filmului \u015fi limba \u00een care este subtitrat. Pentru a introduce \u00een tabel datele care arat\u0103 aceast\u0103 coresponden\u0163\u0103 utiliz\u0103m urm\u0103torul cod SQL:<\/p>\n<p>INSERT INTO &#8220;FILM&#8221;.&#8221;SUBTITRARE&#8221; (COD_LIMBA, NUME_LIMBA) VALUES (&#8216;en&#8217;, &#8216;romana&#8217;)Tabelul \u201cSUBTITRARE\u201d va avea structura \u00een urma inser\u0103rii datelor ca \u00een figura 4.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_4.png\" alt=\"\" width=\"231\" height=\"80\" \/><\/p>\n<p align=\"center\">Figura 4. Con\u0163inut tabel Subtitrare<\/p>\n<p>Pentru a introduce date \u00een tabelul \u201eFILM_LIPSA_STOC\u201d utiliz\u0103m urm\u0103torul cod SQL:<\/p>\n<p>INSERT INTO &#8220;FILM&#8221;.&#8221;FILM_LIPSA_STOC&#8221; (ID_LIPSA_FILM, FILM_DENUMIRE, FORMAT_SUPORT) VALUES (&#8217;23&#8217;, &#8216;Courage Under Fire&#8217;, &#8216;DVD&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_LIPSA_STOC&#8221; (ID_LIPSA_FILM, FILM_DENUMIRE, FORMAT_SUPORT) VALUES (&#8217;41&#8217;, &#8216;Die Hard a Vengeance&#8217;, &#8216;VHS&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILM_LIPSA_STOC&#8221; (ID_LIPSA_FILM, FILM_DENUMIRE, FORMAT_SUPORT) VALUES (&#8217;63&#8217;, &#8216;The Replacement Killers&#8217;, &#8216;DVD&#8217;)Tabelul \u201cFILM_LIPSA_STOC\u201d va avea structura \u00een urma inser\u0103rii datelor ca \u00een figura 5.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_5.png\" alt=\"\" width=\"429\" height=\"135\" \/><\/p>\n<p align=\"center\">Figura 5. Con\u0163inut tabel Film Lipsa Stoc<\/p>\n<p>Pentru a introduce date \u00een tabelui \u201eCOPII_FILM\u201d utiliz\u0103m urmatorul cod SQL:<\/p>\n<p>INSERT INTO &#8220;FILM&#8221;.&#8221;COPII_FILM&#8221; (ID_FILM, NR_COPII, DENUMIRE_FILM, FORMAT_MEDIA) VALUES (&#8216;3&#8217;, &#8216;4&#8217;, &#8216;Lethal Weapon&#8217;, &#8216;DVD&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;COPII_FILM&#8221; (ID_FILM, NR_COPII, DENUMIRE_FILM, FORMAT_MEDIA) VALUES (&#8216;1&#8217;, &#8216;6&#8217;, &#8216;The Matrix&#8217;, &#8216;DVD&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;COPII_FILM&#8221; (ID_FILM, NR_COPII, DENUMIRE_FILM, FORMAT_MEDIA) VALUES (&#8216;7&#8217;, &#8216;3&#8217;, &#8216;Frantic&#8217;, &#8216;DVD&#8217;)Tabelul \u201cCOPII_FILM\u201d va avea structura \u00een urma inser\u0103rii datelor ca \u00een figura 6 \u015fi va con\u0163ine filmele care de\u0163in copii.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_6.png\" alt=\"\" width=\"404\" height=\"133\" \/><\/p>\n<p align=\"center\">Figura 6. Con\u0163inut tabel Copii Film<\/p>\n<p>Pentru a introduce datele corespunz\u0103toare filmelor pe care le-am \u00eenchiriat \u00een tabelul \u201eFILME_INCHIRIATE\u201d, utiliz\u0103m urm\u0103torul cod SQL:<\/p>\n<p>INSERT INTO &#8220;FILM&#8221;.&#8221;FILME_INCHIRIATE&#8221; (ID_FILM, ID_FILM_COPIE, DATA_INCHIRIERE, TITLU_FILM, PRET_INCHIRIERE) VALUES (&#8216;3&#8217;, &#8216;2&#8217;, TO_DATE(&#8217;04-APR-06&#8242;, &#8216;DD-MON-RR&#8217;), &#8216;Lethal Weapon&#8217;, &#8217;19&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILME_INCHIRIATE&#8221; (ID_FILM, ID_FILM_COPIE, DATA_INCHIRIERE, TITLU_FILM, PRET_INCHIRIERE) VALUES (&#8216;1&#8217;, &#8216;3&#8217;, TO_DATE(&#8217;21-JUN-01&#8242;, &#8216;DD-MON-RR&#8217;), &#8216;The Matrix&#8217;, &#8217;18&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;FILME_INCHIRIATE&#8221; (ID_FILM, ID_FILM_COPIE, DATA_INCHIRIERE, TITLU_FILM, PRET_INCHIRIERE) VALUES (&#8216;7&#8217;, &#8216;3&#8217;, TO_DATE(&#8217;11-AUG-10&#8242;, &#8216;DD-MON-RR&#8217;), &#8216;Frantic&#8217;, &#8217;20&#8217;)Tabelul \u201cFILME_INCHIRIATE\u201d va avea structura \u00een urma inser\u0103rii datelor ca \u00een figura 7.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_7.png\" alt=\"\" width=\"593\" height=\"136\" \/><\/p>\n<p align=\"center\">Figura 7. Con\u0163inut tabel Filme Inchiriate<\/p>\n<p>Pentru a introduce datele clien\u0163ilor care au \u00eenchiriat filme de la magazinul nostru, \u00een tabelul \u201eCLIENTI_INCHIRIERE_FILM\u201d, utiliz\u0103m urm\u0103torul cod SQL:<\/p>\n<p>INSERT INTO &#8220;FILM&#8221;.&#8221;CLIENTI_INCHIRIERE_FILM&#8221; (CLIENT_ID, NUME, PRENUME, ADRESA, ORAS, CNP, TEL) VALUES (&#8216;2632&#8217;, &#8216;Popescu&#8217;, &#8216;Valentin&#8217;, &#8216;Republicii 22&#8217;, &#8216;Bucuresti&#8217;, &#8216;1426784951209&#8217;, &#8216;0214716683&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;CLIENTI_INCHIRIERE_FILM&#8221; (CLIENT_ID, NUME, PRENUME, ADRESA, ORAS, CNP, TEL) VALUES (&#8216;1874&#8217;, &#8216;Ana&#8217;, &#8216;Maria&#8217;, &#8216;Take Ionescu 12&#8217;, &#8216;Timisoara&#8217;, &#8216;2705448793256&#8217;, &#8216;0256447391&#8217;)<br \/>\nINSERT INTO &#8220;FILM&#8221;.&#8221;CLIENTI_INCHIRIERE_FILM&#8221; (CLIENT_ID, NUME, PRENUME, ADRESA, ORAS, CNP, TEL) VALUES (&#8216;4133&#8217;, &#8216;Alexandru&#8217;, &#8216;Nicolae&#8217;, &#8216;Soroca 36&#8217;, &#8216;Brasov&#8217;, &#8216;1203698754128&#8217;, &#8216;0729477596&#8217;)Tabelul \u201cCLIENTI _INCHIRIERE_FILM\u201d va avea structura \u00een urma inser\u0103rii datelor ca \u00een figura 8 \u015fi va con\u0163ine datele personale ale clien\u0163ilor care au inchiriat filme.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_8.png\" alt=\"\" width=\"583\" height=\"131\" \/><\/p>\n<p align=\"center\">Figura 8. Con\u0163inut tabel Clienti Inchiriere Film<\/p>\n<p><!--more--><br \/>\n<strong>Diagrama entitate \u2013 rela\u0163ie<\/strong><br \/>\nDiagrama E\/R pentru modelul de date prezentat se poate vedea \u00een figura 12.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_12.png\" alt=\"\" width=\"635\" height=\"610\" \/><\/p>\n<p align=\"center\">Fig.12. Diagrama E\/R a studiului de caz<\/p>\n<p>Pentru modelul de date pe care \u00eel descriu entit\u0103\u0163ile sunt urm\u0103toarele:<\/p>\n<p>FILM_STOC, GEN_FILM, LIMBA_FILM, SUBTITRARE, FILM_LIPSA_STOC, COPII_FILM, FILME_INCHIRIATE, CLIENTI_INCHIRIERE_FILMAm s\u0103 prezint \u00een continuare entita\u0163ile modelului de date al studiului de caz \u015fi voi face o descriere a fiecareia. Voi preciza cheia primar\u0103 pentru fiecare entitate.<\/p>\n<p>FILM_STOC = con\u0163ine informa\u0163ii despre numele filmelor pe care le de\u0163ine \u00een stoc societatea care are ca activitate \u00eenchirierea de filme c\u0103tre clien\u0163i. De asemenea tot aici g\u0103sim \u015fi pre\u0163ul de \u00eenchiriere pentru aceste filme at\u00e2t pe supart VHS c\u00e2t \u015fi pe DVD, anul apari\u0163iei filmului \u015fi un cod asociat filmului respectiv. Cheia primar\u0103 a entita\u0163ii este \u201cid_film\u201d.<\/p>\n<p>GEN_FILM = ofer\u0103 informa\u0163ii despre genul filmelor de\u0163inute pe stoc. Cheia primar\u0103 a entita\u0163ii este \u201ccod_gen_film\u201d.<\/p>\n<p>LIMBA_FILM = furnizeaz\u0103 informa\u0163ii despre limba original\u0103 a filmelor existente pe stoc. Cheia primar\u0103 a entita\u0163ii este o cheia compus\u0103 din \u201cid_film\u201d \u015fi \u201ccod_limba\u201d.<\/p>\n<p>SUBTITRARE = ne spune limba \u00een care sunt titrate filmele care au un anumit cod pentru limb\u0103 \u00een entitatea LIMBA_FILM. Adica ce subtitrare \u00eei corespunde unui anumit film care are un cod pentru limb\u0103 \u00een entitatea LIMBA_FILM. Cheia primar\u0103 a entita\u0163ii este o cheie compus\u0103 din \u201c cod_limba\u201d \u015fi \u201cnume_limba\u201d<\/p>\n<p>FILM_LIPSA_STOC = ne ofer\u0103 informa\u0163ii despre filmele care nu sunt disponibile \u00een stoc \u015fi formatul acestora VHS sau DVD. Cheia primar\u0103 a entita\u0163ii este \u201cid_lipsa_film\u201d.<\/p>\n<p>COPII_FILM = ofer\u0103 informa\u0163ii despre nr. de copii existente ale filmelor din stoc, denumirea acestor filme c\u0103t \u015fi suportul pe care se g\u0103sesc aceste filme VHS sau DVD. Cheia primar\u0103 a entita\u0163ii este o cheia compus\u0103 din \u201c id_film\u201d \u015fi \u201c nr_copii\u201d.<\/p>\n<p>FILME_INCHIRIATE = furnizeaz\u0103 informa\u0163ii despre filmele \u00eenchiriate clien\u0163ilor, titlul filmelor \u00eenchiriate , pretul de \u00eenchiriere, data \u00eenchirierii, data cand filmele trebuie returnate c\u00e2t \u015fi penalizarea pentru \u00eentarzierea return\u0103rii sau pierderii produsului. Cheia primar\u0103 a entita\u0163ii este o cheie compus\u0103 din \u201cid_film\u201d \u015fi \u201cid_film_copie\u201d.<\/p>\n<p>CLIENTI_INCHIRIERE_FILM = ne ofer\u0103 informa\u0163ii despre datele personale ale clien\u0163ilor care au inchiriat filme, c\u00e2t \u015fi numarul de telefon al acestora. Cheia primar\u0103 a entita\u0163ii este \u201cclient_id\u201d.<\/p>\n<p>Am s\u0103 prezint rela\u0163iile modelului de date al studiului de caz \u015fi voi face o descriere a acestora. De asemenea pentru fiecare rela\u0163ie voi prezenta cardinalitatea minim\u0103 \u015fi maxim\u0103.<\/p>\n<p>FILM_STOC are GEN_FILM = rela\u0163ia dintre FILM_STOC \u015fi GEN_FILM reflect\u0103 leg\u0103tura dintre acestea ( un film existent pe stoc are un anumit gen, de ex. actiune, comedie, etc). Ea are cardinalitatea minima 1:1 (un film existent \u00een stoc are un anumit gen \u015fi un anumit gen de film poate s\u0103 existe \u00een filmele de pe stoc) \u015fi cardinalitatea maxim\u0103 1:n ( un film existent \u00een stoc are un anumit gen, dar mai multe genuri de filme pot exista pe stoc).<\/p>\n<p>FILM_STOC \u00eenchiriaz\u0103 FILME_INCHIRIATE = rela\u0163ia de tip many-to-many dintre entitatea FILM_STOC \u015fi FILME_INCHIRIATE reflect\u0103 legatura dintre acestea ( unul sau mai multe filme de pe stoc sunt oferite spre a fi inchiriate ). Aceast\u0103 rela\u0163ie are cardinalitatea 1:1 ( un anumit film existent \u00een stoc este oferit spre a fi inchiriat \u015fi de asemenea un film inchiriat este unul din filmele existente pe stoc) \u015fi cardinalitatea maxim\u0103 m:n ( mai multe filme existente pe stoc sunt oferite spre inchiriere \u015fi mai multe filme \u00eenchiriate sunt dintre filmele existente pe stoc).<\/p>\n<p>FILM_STOC are COPII_FILM = rela\u0163ie de tip many-to-many dintre entita\u0163ile FILM_STOC \u015fi COPII_FILM arat\u0103 legatura dintre acestea (mai multe filme existente pe stoc au mai multe copii ). Aceast\u0103 relatie are cardinalitatea maxim\u0103 m:n \u015fi cardinalitatea minima 1:1.<\/p>\n<p>FILM_STOC are LIMBA_FILM = rela\u0163ia dintre entita\u0163ile FILM_STOC \u015fi LIMBA_FILM reflect\u0103 legatura dintre aceste entita\u0163i ( unul sau mai multe filme de pe stoc au o limb\u0103 original\u0103 \u00een care au fost regizate ). Aceasta rela\u0163ie are cardinalitatea minim\u0103 1:1 ( un film de pe stoc are o limb\u0103 \u00een care a fost regizat ) \u015fi cardinalitatea maxim\u0103 1:n ( mai multe filme din stoc au o singur\u0103 limb\u0103 \u00een care au fost regizate ).<\/p>\n<p>LIMBA_FILM are SUBTITRARE = rela\u0163ia dintre entit\u0103\u0163ile LIMBA_FILM \u015fi SUBTITRARE ( limba original\u0103 \u00een care a fost regizat un anumit film are o anumit\u0103 subtitrare ). Rela\u0163ia are cardinalitatea minim\u0103 1:1 (un film are o subtitrare \u015fi o subtitrare corespunde unui film) \u015fi cadinalitatea maxim\u0103 1:n (o subtitrare poate exista la mai multe filme).<\/p>\n<p>CLIENTI_INCHIRIERE_FILM \u00eenchiriaz\u0103 FILME_INCHIRIATE = rela\u0163ie de tip many-to-many dintre entita\u0163ile CLIENTI_INCHIRIERE_FILM \u015fi FILME_INCHIRIATE reflect\u0103 leg\u0103tura dintre acestea ( filmele care sunt \u00eenchiriate clientilor ). Aceast\u0103 rela\u0163ie are cardinalitatea maxim\u0103 m:n (mai multe filme sunt \u00eenchiriate la mai mul\u0163i clien\u0163i \u015fi mai multi clienti au inchiriat mai multe filme) \u015fi cardinalitatea minim\u0103 1:1 (un film este \u00eenchiriat la un client \u015fi un client a \u00eenchiriat un singur film).<\/p>\n<p>COPII_FILM \u00eenchiriaz\u0103 FILME_INCHIRIATE = rela\u0163ie de tip many-to-many dintre entita\u0163iile COPII_FILM \u015fi FILME_INCHIRIATE reflect\u0103 leg\u0103tura dintre aceste entita\u0163i (copii a filmelor sunt \u00eenchiriate). Aceast\u0103 rela\u0163ie are cardinalitatea maxim\u0103 m:n (mai multe copii ale filmelor sunt \u00eenchiriate \u015fi mai multe filme \u00eenchiriate sunt dintre filmele care au copii).<\/p>\n<p>FILM_LIPSA_STOC are GEN_FILM = rela\u0163ia dintre entita\u0163ile FILM_LIPSA_STOC \u015fi GEN_FILM reflect\u0103 leg\u0103tura dintre acestea ( filmele care nu sunt disponibile pe stoc au anumite genuri ). Aceasta rela\u0163ie are cardinalitatea 1:1 ( un film inexistent pe stoc are un gen \u015fi un anumit gen de film nu exist\u0103 printre filmele care nu sunt momentan disponibile pe stoc ), \u015fi cardinalitatea maxim\u0103 n:m.<\/p>\n<p>\u00cen continuare am s\u0103 descriu trei entita\u0163i \u00eempreun\u0103 cu atributele acestora, tipurile de date, lungimea lor maxim\u0103 \u015fi o descriere a acestora pentru exemplificare.<\/p>\n<div>Entitatea FILM_STOC are ca atribute:<\/div>\n<p>id_film = variabil\u0103 de tip number, de lungime maxim\u0103 2, care reprezint\u0103 id-ul unui film existent pe stoc<\/p>\n<p>code_gen_film = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 8 biti, care reprezint\u0103 codul genului de film existent pe stoc<\/p>\n<p>nume_film = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 50 biti, care reprezint\u0103 numele filmului<\/p>\n<p>pret_VHS = variabil\u0103 de tip float, de lungime maxim\u0103 2, care reprezint\u0103 pre\u0163ul de \u00eenchiriere a unui film pe suport VHS<\/p>\n<p>pret_DVD = variabil\u0103 de tip float, de lungime maxim\u0103 2, care reprezint\u0103 pre\u0163ul de \u00eenchiriere a unui film pe suport DVD<\/p>\n<p>an _aparitie = variabil\u0103 de tip number, de lungime maxim\u0103 4, care reprezint\u0103 anul de aparitie al filmului<\/p>\n<div>Entitatea FILME_INCHIRIATE are ca atribute:<\/div>\n<p>Id_film = variabil\u0103 de tip number, de lungime maxim\u0103 2, care reprezint\u0103 id-ul filmului \u00eenchiriat<\/p>\n<p>Id_film_copie = variabil\u0103 de tip number, de lungime maxim\u0103 2, care reprezint\u0103 id-ul filmului copie \u015fi \u00eempreuna cu id_film formeraz\u0103 cheia primar\u0103 a entita\u0163ii FILME_INCHIRIATE<\/p>\n<p>Data_inchiriere = variabil\u0103 de tip date, care reprezint\u0103 data la care a fost \u00eenchiriat un anumit film<\/p>\n<p>Titlu_film = variabil\u0103 de tip varchar 2 , de lungime 50 biti, care reprezint\u0103 titlul filmului \u00eenchiriat<\/p>\n<p>Pret_inchiriere = variabil\u0103 de tip float, de lungime maxim\u0103 2, care reprezint\u0103 pre\u0163ul \u00eenchirierii filmului<\/p>\n<div>Penalizare_intarziere_pierdere = variabil\u0103 de tip number, de lungime maxim\u0103 4, care reprezint\u0103 pre\u0163ul penaliz\u0103rii restituirii filmului sau al pierderii acestuia<\/div>\n<p>Data_returnare = variabil\u0103 de tip date, care reprezint\u0103 data la care a fost returnat filmul \u00eenchiriat<\/p>\n<div>Entitatea CLIENTI_INCHIRIERE_FILM are ca atribute:<\/div>\n<p>Client_id = variabil\u0103 de tip number, de lungime maxim\u0103 2, care reprezint\u0103 id-ul clientului care a \u00eenchiriat un anumit film<\/p>\n<p>Nume = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 16 biti, care reprezint\u0103 numele clientului care a \u00eenchiriat filme<\/p>\n<p>Prenume = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 16 biti, care reprezint\u0103 prenumele clientului care a \u00eenchiriat filme<\/p>\n<p>Adresa = variabil\u0103 de tip varchar 2 , de lungime 32 biti, care reprezint\u0103 adresa clientului care a \u00eenchiriat filme<\/p>\n<p>Oras = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 16 biti, care reprezint\u0103 ora\u015ful din care este clientul care a \u00eenchiriat filme<\/p>\n<p>Cnp = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 13 biti, care reprezint\u0103 codul numeric personal al clientului<\/p>\n<p>Tel = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 16 biti, care reprezint\u0103 numarul de telefon al clientului<\/p>\n<p>Voi descrie \u00een continuare ca exemplu atributele rela\u0163iei \u201cFILM_STOC are GEN_FILM\u201d, tipul de date, lungimea \u00een biti a fiecarui atribut al rela\u0163iei \u015fi ce reprezint\u0103 fiecare.<\/p>\n<p>Rela\u0163ia FILM_STOC are GEN_FILM are ca atribute :<\/p>\n<p>cod_gen_film = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 8 biti, care reprezint\u0103 codul genului de film. Atributul trebuie s\u0103 corespund\u0103 la o valoare a cheii primare din tabelul (entitatea) GEN_FILM.<\/p>\n<p>id_film = variabil\u0103 de tip number, de lungime maxim\u0103 2, care reprezint\u0103 id-ul unui film existent pe stoc. Atributul trebuie s\u0103 corespund\u0103 la o valoare a cheii primare din tabelul (entitatea) FILM_STOC.<\/p>\n<p>descriere_film = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 50 biti, care ofer\u0103 o scurt\u0103 descriere despre un anumit film. Atributul trebuie s\u0103 corespund\u0103 la o valoare corespunz\u0103toare a tipului de date din tabelul (entitatea) GEN_FILM.<\/p>\n<p>nume_film = variabil\u0103 de tip varchar 2, de lungime maxim\u0103 50 biti, care reprezint\u0103 numele filmului. Atributul trebuie s\u0103 corespund\u0103 la o valoare corespunzatoare a tipului de date din tabelul (entitatea) FILM_STOC.<\/p>\n<p>pret_VHS = variabil\u0103 de tip float, de lungime maxim\u0103 2, care reprezint\u0103 pretul de \u00eenchiriere a unui film pe suport VHS. Atributul trebuie s\u0103 corespund\u0103 la o valoare corespunz\u0103toare a tipului de date din tabelul (entitatea) FILM_STOC.<\/p>\n<p>pret_DVD = variabil\u0103 de tip float, de lungime maxim\u0103 2, care reprezint\u0103 pre\u0163ul de \u00eenchiriere a unui film pe suport DVD. Atributul trebuie s\u0103 corespund\u0103 la o valoare corespunz\u0103toare a tipului de date din tabelul (entitatea) FILM_STOC.<\/p>\n<p>an _aparitie = variabil\u0103 de tip number, de lungime maxim\u0103 4, care reprezint\u0103 anul de apari\u0163ie al filmului. Atributul trebuie s\u0103 corespund\u0103 la o valoare corespunzatoare a tipului de date din tabelul (entitatea) FILM_STOC.<\/p>\n<p><!--more--><br \/>\n<strong>Diagrama conceptual\u0103 \u2013 cheia primar\u0103, cheia str\u0103in\u0103<\/strong><br \/>\nPrimul pas \u00een proiectarea unei baze de date rela\u0163ionale este acela de a analiza situa\u0163ia real\u0103 pe care trebuie s\u0103 o reprezent\u0103m sau s\u0103 o model\u0103m prin intermediul bazei noastre de date.<\/p>\n<div>Acest lucru implica:<\/div>\n<p>Cerin\u0163ele utilizatorilor \u00een ce prive\u015fte datele pe care trebuie s\u0103 le stoc\u0103m \u015fi administr\u0103m<br \/>\nCerin\u0163ele utilizatorilor \u00een ce prive\u015fte opera\u0163iile care trebuie s\u0103 fie efectuate cu aceste date\u00cen cazul modelului rela\u0163ional din lucrarea mea, pentru a ob\u0163ine schema conceptual\u0103 voi pleca de la o descriere mai detaliat\u0103 a entita\u0163ilor \u015fi atributelor, a rela\u0163iilor dintre aceste entita\u0163i \u015fi condi\u0163iile pe care acestea trebuie s\u0103 le \u00eendeplineasc\u0103, deci voi pleca de la diagrama E\/R a studiului de caz. Scopul este de a reprezenta entit\u0103\u0163iile \u015fi leg\u0103turile dintre entit\u0103\u0163i prin intermediul unor rela\u0163ii sau tabele.<\/p>\n<p>\u00cen diagrama conceptual\u0103 voi reprezenta prin simbolul \u201cx\u201d locul unde este plasat\u0103 cheia extern\u0103, iar prin simbolul \u201cx\u201d voi ar\u0103ta c\u0103 respectiva cheie extern\u0103 este con\u0163inut\u0103 \u00een cheia primar\u0103.<\/p>\n<p>Schema conceptual\u0103 a bazei de date corespunde unei descrieri de forma:<\/p>\n<p>nume_entitate = {list\u0103 de atribute}<\/p>\n<p>Cheile primare sunt atributele subliniate. Entita\u0163ile \u015fi atributele sunt apelate prin substantive, iar rela\u0163iile dintre entita\u0163i sunt denumite prin verbe. \u00cen unele cazuri ordinea entita\u0163ilor din rela\u0163ie este importanta \u015fi atunci avem doua rela\u0163ii care se citesc de la stanga la dreapta \u015fi invers de la dreapta la stanga, dar \u015fi situa\u0163ii \u00een care ordine nu conteaza. Numele date entita\u0163ilor \u015fi rela\u0163iilor trebuie s\u0103 fie unice, iar numele atributelor trebuie s\u0103 fie unice numai la nivelul aceleia\u015fi entita\u0163i. Este de preferat pentru simplitatea referin\u0163elor, ca numele atributelor care sunt chei primare s\u0103 fie unice la nivelul bazei de date.<\/p>\n<p>Entita\u0163ile independente <strong> CLIENTI_INCHIRIERE_FILM<\/strong>, <strong>FILM_LIPSA_STOC<\/strong> devin tabele independente. Cheile primare ale celor doua entita\u0163i independente sunt:<\/p>\n<p>CLIENTI_INCHIRIERE_FILM = {<strong><i>CLIENT_ID<\/i><\/strong>, <i>NUME<\/i>, <i>PRENUME<\/i>, <i>ADRESA<\/i>, <i>ORAS<\/i>, <i>CNP<\/i>, <i>TEL<\/i>};<\/p>\n<p>FILM_LIPSA_STOC = {<i><strong>ID_LIPSA_FILM<\/strong><\/i>, <i>FILM_DENUMIRE<\/i>, <i>FORMAT_SUPORT<\/i>};<\/p>\n<p>Entita\u0163iile dependente devin tabele dependente. Cheile primare ale celor trei entita\u0163i dependente sunt urmatoarele:<\/p>\n<p>COPI_FILM = { <strong><i>ID_FILM<\/i><\/strong>, <strong><i>NR_COPII<\/i><\/strong>, <i>DENUMIRE_FILM<\/i>, <i>FORMAT_MEDIA<\/i> };<\/p>\n<p>FILME_INCHIRIATE = {<strong><i>ID_FILM<\/i><\/strong>, <strong><i>ID_FILM_COPIE<\/i><\/strong>, <i>DATA_INCHIRIERE<\/i>, <i>TITLU_FILM<\/i>, <i>PRET_INCHIRIERE<\/i>, <i>PENALIZARE_INTARZIERE_PIERDERE<\/i>, <i>DATA_RETURNARE<\/i> };<\/p>\n<p>GEN_FILM = {<strong><i>COD_GEN_FILM<\/i><\/strong>, <i>DESCRIERE_FILM<\/i> };<\/p>\n<p>Subentitatea <strong>SUBTITRARE<\/strong> devine subtabel , avand cheia primar\u0103 compus\u0103 din atributele COD_LIMBA \u015fi NUME_LIMBARela\u0163iile de tip <strong>one-to-one<\/strong> \u015fi <strong>one-to-many<\/strong> devin chei externe.<\/p>\n<p>Rela\u0163ia LIMBA_FILM are SUBTITRARE devine cheie extern\u0103 \u00een tabelul LIMBA_FILM, iar cheia extern\u0103 \u201ccod_limba\u201d din tabelul LIMBA_FILM este con\u0163inut\u0103 \u00een cheia primar\u0103 a tabelului LIMBA_FILM.<\/p>\n<p>Rela\u0163ia FILM_STOC \u00eenchiriaza FILME_INCHIRIATE devine cheie extern\u0103 \u00een tabelul FILME _INCHIRIATE<\/p>\n<p>Rela\u0163iile de tip <strong>many-to-many<\/strong> devin tabele asociative, av\u00e2nd dou\u0103 chei externe \u201cid_film\u201d \u015fi \u201ccod_gen_film\u201d pentru cele patru tabele asociate.<\/p>\n<p>Rela\u0163ia CLIENTI_INCHIRIERE_FILM \u00eenchiriaz\u0103 FILME _INCHIRIATE devine tabel asociativ (INCHIRIAZA).<\/p>\n<p>Rela\u0163ia FILME_INCHIRIATE \u00eenchiriaz\u0103 COPII_FILM devine tabel asociativ (INCHIRIAZA).<\/p>\n<p>Rela\u0163ia FILM_LIPSA_STOC are GEN_FILM devine tabel asociativ (ARE).<\/p>\n<p>Rela\u0163ia FILM_STOC are GEN_FILM devine tabel asociativ (ARE).<\/p>\n<p><strong>Rela\u0163iile de tipul trei<\/strong> (cele care leag\u0103 cel putin trei entita\u0163i) devin tabele asociative, av\u00e2nd chei externe pentru fiecare dintre tabelele asociate.<\/p>\n<p>Rela\u0163ia \u2018are\u201d care leag\u0103 entit\u0103\u0163ile FILM_STOC, GEN_FILM, LIMBA_FILM, COPII_FILM devine tabel asociativ (ARE). Tabelul asociativ are chei externe atributele: ID_FILM \u015fi COD_GEN_FILM , acestea sunt con\u0163inute \u00een cheile primare.<\/p>\n<p>Schemele rela\u0163ionale corespunz\u0103toare diagramei conceptuale sunt urm\u0103toarele:<\/p>\n<p><strong>FILM_STOC<\/strong>(ID_FILM#, COD_GEN_FILM#, NUME_FILM, PRET_VHS, PRET_DVD, AN_APARITIE )<br \/>\n<strong>GEN_FILM<\/strong>(COD_GEN_FILM#, DESCRIERE_FILM )<br \/>\n<strong>LIMBA_FILM<\/strong>(ID_FILM#, COD_LIMBA# )<br \/>\n<strong>SUBTITRARE<\/strong> ( COD_LIMBA#, NUME_LIMBA# )<br \/>\n<strong>COPII_FILM<\/strong> ( ID_FILM#, NR_COPII#, DENUMIRE_FILM, FORMAT_MEDIA )<br \/>\n<strong>FILM_LIPSA_STOC<\/strong> ( ID_LIPSA_FILM#, FILM_DENUMIRE, FORMAT_MEDIA )<br \/>\n<strong>FILME_INCHIRIATE<\/strong> ( ID_FILM#, ID_FILM_COPIE#, DATA_INCHIRIERE, TITLU_FILM, PRET_INCHIRIERE, PENALIZARE_INTARZIERE_PIERDERE, DATA_RETURNARE )<br \/>\n<strong>CLIENTI_INCHIRIERE_FILM<\/strong> ( CLIENT_ID#, NUME, PRENUME, ADRESA, ORAS, CNP, TEL )Diagrama conceptual\u0103 a schemelor rela\u0163ionale mai sus men\u0163ionate se poate vedea \u00een figura 13.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_13.png\" alt=\"\" width=\"728\" height=\"623\" \/><\/p>\n<p align=\"center\">Fig.13. Diagrama conceptual\u0103 a studiului de caz<\/p>\n<p><strong>Interog\u0103ri \u2013 exemple de interog\u0103ri<\/strong><\/p>\n<p>Pentru a selecta toate filmele pe care le de\u0163inem \u00een baza de date folosim instruc\u0163iunea SELECT \u00een felul urmator:<\/p>\n<p>SELECT * FROM FILM_STOC;Rezultatul aceste interog\u0103ri se poate vedea \u00een tabelul 14.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_14.png\" alt=\"\" width=\"613\" height=\"267\" \/><\/p>\n<p align=\"center\">Fig.14. Con\u0163inut tabel Film Stoc<\/p>\n<p>Pentru a selecta doar un anumit film din baza noastr\u0103 de date de ex. filmul \u201cUnder Siege\u201d folosim instructiunea SELECT \u00eempreuna cu clauza WHERE \u00een felul urmator:<\/p>\n<p>SELECT * FROM FILM_STOC<br \/>\nWHERE NUME_FILM = &#8216;Under Siege&#8217;;Rezultatul acestei interogari va fi cel din figura 15.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_15.png\" alt=\"\" width=\"513\" height=\"58\" \/><\/p>\n<p align=\"center\">Fig.15. Rezultat interogare folosind clauza WHERE<\/p>\n<p>Pentru a vedea c\u0103te copii ale filmului \u201cLethal Weapon\u201d avem utiliz\u0103m urmatoarea interogare:<\/p>\n<p>SELECT * FROM COPII_FILM<br \/>\nWHERE DENUMIRE_FILM =&#8217;Lethal Weapon&#8217;<br \/>\nAND ID_FILM = &#8216;3&#8217;;Rezultatul acestei interogari va fi cel din fig. 16.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_16.png\" alt=\"\" width=\"357\" height=\"60\" \/><\/p>\n<p align=\"center\">Fig.16. Rezultat interogare dup\u0103 nr. copii film Lethal Weapon<\/p>\n<p>Pentru a interoga baza noastr\u0103 de date \u015fi a afla dac\u0103 filmul \u2018Die Hard a Vengeance\u2019 este unul din filmele care nu le detinem pe stoc la un moment dat, iar formatul suportului este VHS putem utiliza urm\u0103toarea interogare:<\/p>\n<p>SELECT * FROM FILM_LIPSA_STOC<br \/>\nWHERE FILM_DENUMIRE =&#8217;Die Hard a Vengeance&#8217;<br \/>\nAND FORMAT_SUPORT = &#8216;VHS&#8217;;Rezultatul interogarii este cel din fig. 17.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_17.png\" alt=\"\" width=\"367\" height=\"51\" \/><\/p>\n<p align=\"center\">Fig.17. Rezultat interogare dup\u0103 film lipsa stoc \u015fi suport VHS<\/p>\n<p>Dac\u0103 dorim s\u0103 interogam baza noastr\u0103 de date pentru a afla informatii care sunt dispuse \u00een dou\u0103 sau mai multe tabele putem utiliza instruc\u0163iunea SELECT \u00een combina\u0163ie cu clauzele WHERE \u015fi JOIN. De exemplu dac\u0103 dorim s\u0103 afl\u0103m denumirea filmelor care au copii, formatul media al acestor filme \u015fi data la care aceste copii ale filmelor au fost \u00eenchiriate clien\u0163ilor utiliz\u0103m clauzele WHERE \u015fi JOIN \u00een interogare \u00een felul urm\u0103tor:<\/p>\n<p>SELECT DENUMIRE_FILM, FORMAT_MEDIA, DATA_INCHIRIERE FROM COPII_FILM C, FILME_INCHIRIATE F WHERE C.ID_FILM = F.ID_FILM;<\/p>\n<p>sau cu clauza join:SELECT DENUMIRE_FILM, FORMAT_MEDIA, DATA_INCHIRIERE FROM COPII_FILM C JOIN FILME_INCHIRIATE F ON (C.ID_FILM=F.ID_FILM);<\/p>\n<p>sau \u00een felul urmator:SELECT DENUMIRE_FILM, FORMAT_MEDIA, DATA_INCHIRIERE FROM COPII_FILM JOIN FILME_INCHIRIATE USING (ID_FILM);<\/p>\n<p>Rezultatul acestor trei metode de interog\u0103ri va fi cel din fig.18<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_18.png\" alt=\"\" width=\"341\" height=\"102\" \/><\/p>\n<p align=\"center\">Fig.18. Rezultatul interog\u0103rilor \u00eentoarce date din dou\u0103 tabele<\/p>\n<p>Selec\u0163ia de mai jos cu clauza JOIN extrage date din tabelele FILM_STOC \u015fi LIMBA_FILM \u015fi ne ofer\u0103 informa\u0163ii despre numele filmului, anul apari\u0163iei \u015fi limba \u00een care a fost regizat filmul.<\/p>\n<p>SELECT NUME_FILM, AN_APARITIE, COD_LIMBA<br \/>\nFROM FILM_STOC F JOIN LIMBA_FILM L ON (F.ID_FILM = L.ID_FILM);Rezultatul interogarii este ar\u0103tat \u00een figura 19.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_19.png\" alt=\"\" width=\"369\" height=\"264\" \/><\/p>\n<p align=\"center\">Fig.19. Rezultatul interog\u0103rii \u00eentoarce date din tabelul FILM_STOC \u015fi LIMBA_FILM<\/p>\n<p>Daca dorim s\u0103 afl\u0103m o scurt\u0103 descriere a fiecarui film din figura 19 putem utiliza urm\u0103toarea interogare folosind clauza JOIN \u00een felul urmator:<\/p>\n<p>SELECT NUME_FILM, DESCRIERE_FILM<br \/>\nFROM FILM_STOC F JOIN GEN_FILM G ON (F.COD_GEN_FILM = G.COD_GEN_FILM);sau \u00een felul urmator:<\/p>\n<p>SELECT NUME_FILM, DESCRIERE_FILM<br \/>\nFROM FILM_STOC JOIN GEN_FILM USING (COD_GEN_FILM);Rezultatul celor dou\u0103 modalit\u0103\u0163i de interogare va fi cel din figura 20.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_20.png\" alt=\"\" width=\"306\" height=\"269\" \/><\/p>\n<p align=\"center\">Fig. 20. Rezultatul celor dou\u0103 interog\u0103rii ofer\u0103 o scurt\u0103 descriere a fiec\u0103rui film din fig 19<\/p>\n<p>Daca dorim s\u0103 \u0163inem eviden\u0163a tuturor filmelor de ac\u0163iune care au fost \u00eenchiriate \u00eentr-o perioad\u0103 de timp, numele \u015fi prenumele celor care au \u00eenchiriat aceste filme, c\u00e2t \u015fi data \u00eenchirierii \u015fi pre\u0163ul avem nevoie s\u0103 consult\u0103m informa\u0163ii care se afl\u0103 \u00een trei tabele \u015fi anume FILM_STOC, CLIENTI_INCHIRIERE_FILM, FILME_INCHIRIATE. Pentru a ob\u0163ine aceste informa\u0163ii putem crea o vizualizare \u015fi apoi s\u0103 consult\u0103m acea vizualizare ca s\u0103 ob\u0163inem informa\u0163iile care ne intereseaz\u0103.<\/p>\n<p>Vizualizarea pe care am creat-o ca exemplu se numeste FILME_ACT_INCHIRIATE \u015fi are urmatorul cod SQL:<\/p>\n<p>CREATE VIEW FILME_ACT_INCHIRIATE AS<br \/>\nSELECT COD_GEN_FILM, NUME_FILM, NUME, PRENUME, DATA_INCHIRIERE, PRET_INCHIRIERE<br \/>\nFROM FILM_STOC, CLIENTI_INCHIRIERE_FILM, FILME_INCHIRIATE<br \/>\nWHERE COD_GEN_FILM = &#8216;act&#8217; ;Acum putem consulta vizualizarea creat\u0103 \u015fi deci ob\u0163ine informa\u0163iile care ne intereseaz\u0103. Pentru a face acest lucru folosim urmatoarea interogare:<\/p>\n<p>SELECT * FROM FILME_ACT_INCHIRIATE;Rezultatul acestei selec\u0163ii va afi\u015fa vizualizarea creat\u0103 anterior, vezi fig.21<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_21.png\" alt=\"\" width=\"597\" height=\"629\" \/><\/p>\n<p align=\"center\">Fig.21. Vizualizare FILME_ACT_INCHIRIATE<\/p>\n<p>Putem c\u0103uta \u00een vizualizarea noastr\u0103 doar informa\u0163iile care ne intereseaz\u0103, de exemplu dorim s\u0103 \u015ftim ce filme a \u00eenchiriat un anumit client \u015fi anume Popescu Valentin. Pentru a ob\u0163ine doar acele linii din vizualizarea noastr\u0103 care corespund clientului Popescu Valentin, rafin\u0103m c\u0103utatea noastr\u0103 ad\u0103ug\u00e2nd clauza WHERE \u00een interogare ca \u00een exemplul de mai jos:<\/p>\n<p>SELECT * FROM FILME_ACT_INCHIRIATE<br \/>\nWHERE NUME = &#8216;Popescu&#8217; AND PRENUME = &#8216;Valentin&#8217;;Acum rezultatul selec\u0163iei din vizualizarea noastr\u0103 va \u00eentoarce doar \u00eenregistrarile care corespund clientului Popescu Valentin. \u00cen figura 22 putem vedea doar \u00eenregistrarile referitoare la clientul Popescu Valentin.<\/p>\n<p align=\"center\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/eugo.ro\/img-prog-OracleDB\/fig_22.png\" alt=\"\" width=\"582\" height=\"243\" \/><\/p>\n<p align=\"center\">Fig.22. Vizualizare FILME_ACT_INCHIRIATE care corespunde clientului Popescu Valentin<\/p>\n<\/div>\n<div class=\"sidebar\"><\/div>\n<\/div>\n<p><!-- Default Statcounter code for eugo.ro\nhttps:\/\/www.eugo.ro --><br \/>\n<script type=\"text\/javascript\">\nvar sc_project=5241295; \nvar sc_invisible=1; \nvar sc_security=\"f184e0a9\"; \n<\/script><br \/>\n<script type=\"text\/javascript\"\nsrc=\"https:\/\/www.statcounter.com\/counter\/counter.js\"\nasync><\/script><br \/>\n<noscript><\/p>\n<div class=\"statcounter\"><a title=\"Web Analytics\"\nhref=\"https:\/\/statcounter.com\/\" target=\"_blank\"><img\nclass=\"statcounter\"\nsrc=\"https:\/\/c.statcounter.com\/5241295\/0\/f184e0a9\/1\/\"\nalt=\"Web Analytics\"\nreferrerPolicy=\"no-referrer-when-downgrade\"><\/a><\/div>\n<p><\/noscript><br \/>\n<!-- End of Statcounter Code --><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Conceptele Bazelor de Date Rela\u0163ionale Definirea bazei de date Prin intermediul calculatoarelor electronice se pot realiza activit\u0103\u0163i precum stocare, interogare \u015fi administrare de colec\u0163ii de date. Prin intermediul tehnologiilor informa\u0163ionale se pot definii tehnici \u015fi metode de oraganizare a colec\u0163iilor de date. Organizarea \u00een fi\u015fiere de date \u015fi organizarea \u00een baze de date sunt dou\u0103 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[],"class_list":["post-61","post","type-post","status-publish","format-standard","hentry","category-baze-de-date"],"_links":{"self":[{"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/posts\/61","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/eugo.ro\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=61"}],"version-history":[{"count":41,"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/posts\/61\/revisions"}],"predecessor-version":[{"id":432,"href":"https:\/\/eugo.ro\/index.php?rest_route=\/wp\/v2\/posts\/61\/revisions\/432"}],"wp:attachment":[{"href":"https:\/\/eugo.ro\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=61"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/eugo.ro\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=61"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/eugo.ro\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=61"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}