Documente Academic
Documente Profesional
Documente Cultură
B. MIRONOV
ndrumar de laborator
Schema extern 1
Schema extern i
Schema conceptual Schema intern
Schema extern n
Chiinu 2001
Prezentul ndrumar de laborator se adreseaz studenilor facultii Calculatoare, Informatic i Microelectronic, care studiaz cursul aprofundat de "Baze de date", grupelor de studii n cadrul magistraturii, care studiaz limbajul SQL i n special sistemul Oracle. El poate fi consultat i de studenii altor faculti n cadrul cursurilor de informatic. Ciclul conine 11 lucrri de laborator, consacrate crerii i gestionrii bazelor de date relaionale. Fiecare lucrare este prefaat de un material amplu teoretic necesar pentru nelegerea principiilor de operare cu bazele de date. Lucrrile de laborator sunt axate pe sistemul Oracle considerat cel mai utilizat sistem de gestiune a bazelor de date relaionale din ntreaga lume.
U.T.M., 2001
1
CUPRINS LUCRAREA DE LABORATOR NR. 1 Introducere n bazele de date relaionale 3 LUCRAREA DE LABORATOR NR. 2 Structuri logice de stocare a bazelor de date 11 LUCRAREA DE LABORATOR NR. 3. Proiectarea unei baze de date 19 LUCRAREA DE LABORATOR NR. 4 Tipuri de date. Tabele 1 25 LUCRAREA DE LABORATOR NR. 5. Crearea tabelelor 36 LUCRAREA DE LABORATOR NR. 6. Integritatea datelor 42 LUCRAREA DE LABORATOR NR. 7. Selectarea si ntreinerea datelor 54 LUCRAREA DE LABORATOR NR. 8. SQL (limbaj structurat de interogare) 63 LUCRAREA DE LABORATOR NR. 9. Reuniunile i uniunile 77 LUCRAREA DE LABORATOR NR. 10. Vederi 88 LUCRAREA DE LABORATOR NR. 11. Sigurana bazei de date 94 ANEXE Lista cuvintelor rezervate Oracle SQL: 122 Cuvintele rezervate pentru SQL*Plus. 127 Simboluri 129 Bibliografie 123
2. Toate datele individuale dintr-un tabel sunt ntotdeauna accesibile prin furnizarea numelui tabelului, a coloanei i a liniei. 3. Valorile nule sunt tipuri de date valide n baza de date relaional. Ele reprezint inexistena informaiilor. 4. Baza de date relaional reprezint descrierea bazei de date ntr-un format logic simplificat de genul tabelelor. 5. Modelul relaional poate suporta mai multe limbaje, ns SQL este limbajul principal de nterfaare. 6. Toate vederile sunt actualizabile, dac vederea curent este un tabel. 7. Modelul relaional trateaz toate relaiile de baz i relaiile derivate ca un singur operand pentru operaiile update (actualizare), insert (inserare) i delete (eliminare) efectuate asupra datelor, precum i asupra datelor recuperate. 8. Aspectele logice ale bazei de date sunt complet separate de aspectele fizice ale bazei de date. 9. Datele sunt conservate atunci cnd bazei de date i se aduc modificri ilogice. 10. Restriciile de integritate pentru o baz de date relaional sunt create n sublimbajul de baze de date (SQL) i sunt stocate n catalogul bazei de date i nu n aplicaiile individuale. 11. Distribuia datelor ctre programele de aplicaie are loc continuu. Distribuia datelor este procesul de copiere a datelor ntr-o baz de date situat la distan. 12. Regulile i restriciile de integritate nu pot fi evitate de nici un limbaj de acces. 13. Un SGBDR trebuie s fie capabil s gestioneze bazele de date exclusiv pe baza caracteristicilor sale relaionale.
nelegerea celor ce urmeaz, este legat de dou concepte: baza de date i instana. O baz de date este o colecie de date. Programul Oracle stocheaz aceste date folosind modelul relaional. Acest termen se refer att la datele fizice ct i la structurile logice de memorie i la procesele din fundal. Instana se refer la acea parte a memoriei pe care programul Oracle a alocat-o pentru baza de date, precum i la procesele din fundal necesare pentru susinerea bazei de date. Utilizarea programului Oracle prezint urmtoarele avantaje semnificative: - este un sistem deschis" i respect standardele industriale n vigoare referitoare la limbajele de accesare a datelor (SQL); - suport baze de date de orice dimensiuni, ncepnd de la civa octei pn la civa gigaoctei; - suport un mare numr de utilizatori simultan, minimizeaz conflictele de acces la date i garanteaz simultaneitatea datelor; - suport un mediu client/server real. El permite mprirea procesrii ntre baza de date server i programele de aplicaie ale clientului; - ofer caracteristici de siguran total pentru limitarea i monitorizarea accesului la date i a utilizrii acestora; - se comport identic pe toate platformele (Windows, UNIX, Macintosh i sisteme mainframe). Aceasta deoarece peste 80 la sut din codul su este identic pe toate platformele i sistemele de operare. Sistemul Oracle poate fi instalat pe o mare varietate de platforme hardware i de sisteme de operare, inclusiv pe calculatoarele personale. Capacitatea de procesare a sistemului Oracle este dat de structurile de memorie i de procesele acestuia. Toate structurile de memorie rezid n memoria principal a calculatorului. Procesele sunt sarcini i aciuni ale programului i ale utilizatorului care se desfoar n memoria acestor calculatoare. n funcionare, Oracle folosete dou structuri de memorie principale. Zona global a sistemului (SGA - System Global Area) este o structur de memorie care conine datele i controleaz informaiile pentru o instan Oracle. Structura SGA mpreun cu procesele din fundal ale serverului constituie o instan Oracle. Cea de-a doua structur principal de memorie este zona global a programului (PGA - Program Global Area). Aceast structur conine datele i controleaz informaiile 5
pentru un proces server. Structura PGA este creat la declanarea unui proces server. O baz de date Oracle nu este n mod necesar disponibil oricnd tuturor utilizatorilor. Atunci cnd baza de date este deschis, utilizatorii pot accesa informaiile acesteia. Atunci cnd baza de date este nchis, numai administratorul bazei de date are acces la ea. Administratorul bazei de date - sau utilizatorii posesori ai unui privilegiu DBA (Data Base Administrator) sunt singurii care pot s porneasc i s opreasc baza de date. Pornirea bazei de date i punerea ei la dispoziia utilizatorilor din ntregul sistem presupune parcurgerea urmtoarelor trei etape: - pornirea unei instane; - montarea bazei de date; - deschiderea bazei de date. Pornirea unei instane este sinonim cu pornirea bazei de date. Cnd survine acest lucru, programul Oracle aloc o poriune a memoriei partajate i a proceselor din fundal. Aceast poriune alocat a memoriei partajate este cunoscut sub numele de zon global a sistemului (SGA). Dac tocmai a fost pornit o instan, nici o baz de date nu este asociat cu aceast structur de memorie. n consecin, nici un utilizator nu poate accesa informaiile bazei de date. Montarea bazei de date este procesul de asociere a unei baze de date cu o instan pornit anterior. Dup montarea bazei de date, aceasta este nchis tuturor utilizatorilor pn n momentul n care administratorul bazei de date deschide baza de date. Deschiderea bazei de date este procesul prin care baza de date este pus la dispoziia utilizatorilor pentru operaii obinuite de baze de date. Orice utilizator autorizat se poate conecta la o baz de date Oracle deschis i poate accesa informaiile acesteia. Oprirea bazei de date Oracle presupune parcurgerea urmtoarelor trei etape: - nchiderea bazei de date; - demontarea bazei de date; - oprirea bazei de date. nchiderea bazei de date determin scrierea tuturor datelor bazei de date n fiierele de date. Demontarea bazei de date reprezint disocierea bazei 6
de date de instan. n sfrit, oprirea bazei de date duce la ncheierea tuturor proceselor server, iar SGA este eliminat din memorie.
Dicionarul de date reprezint o colecie logic de tabele i de vederi. Ele pot fi accesate prin interogri ale utilizatorilor n vederea obinerii de informaii despre baza de date. Dicionarul de date const dintr-un set de vederi, care sunt accesate prin intermediul limbajului SQL. Anumite vederi sunt accesibile tuturor utilizatorilor n timp ce altele sunt destinate numai administratorilor bazei de date. Urmeaz o scurt trecere n revist a ctorva dintre vederile disponibile tuturor utilizatorilor care posed privilegiul de sistem create session. all_col_coinments Comentarii n legtur cu coloanele tabelelor i vederilor accesibile. all_constraints Definiiile restriciilor asociate tabelelor accesibile. all_db_links Legturile bazei de date accesibile utilizatorului. all_errors Erori curente referitoare la toate obiectele accesibile utilizatorului. all_indexesDescrierea indecilor tabelelor accesibile utilizatorului. all_objectsObiectele accesibile utilizatorului. all_sequencesDescrierea secvenelor accesibile utilizatorului. all_snapshotsToate instantaneele accesibile utilizatorului. all_synonymsToate sinonimele accesibile utilizatorului. all_tablesDescrierea tabelelor accesibile utilizatorului, all_triggersInformaii referitoare la toi declanatorii accesibili utilizatorului. all_usersInformaii despre toi utilizatorii bazei de date. all_viewsTextul vederilor accesibile utilizatorului.
Mersul lucrrii:
1. Activai comanda SQL*PLUS n dependen de sistemul de operare instalat pe calculator (Unele sisteme cer introducerea comenzii n registrul de jos). SQL*PLUS va afia Enter user-name: 2. Introducei numele SCOTT i apsai [Enter]. SQL*PLUS va afia "Enter password:". 9
3. Introducei parola TIGER i apsai [Enter] din nou. Parola nu se afieaz pe ecran. SQL*PLUS va arta versiunea ORACLE, i pachetele disponibile (ex., PL/SQL). Dup aceea, SQL*PLUS va afia: SQL> Ceea ce nseamn c SQL*PLUS este gata de a accepta comenzile. 4. Pentru a putea analiza ulterior activitatea n SQL, nainte de a ncepe lucrul se recomand crearea fiierului-spuller, de exemplu: spool c:/aa/trace1 aici: c:/aa/ - traseul spre fiierul-spuller; trace1 denumirea fiierului-spuller 5. Introducei comanda: describe all_tables; i apsai [Enter]. Care va fi rezultatul? 6. Repetai punctul 5 cu ali operatori din lista vederilor i nregistrai rezultatul. 7. Ieirea din SQL*PLUS, se face cu ajutorul comenzii exit. exit;
Rezumat
n acest capitol, v-ai familiarizat cu sistemul de baze de date relaionale Oracle. Modelul de baze de date relaionale este definit ca o matrice bi-dimensional compus din linii i coloane. Accesul la o anumit dat se realizeaz prin cunoaterea numelui tabelului, coloanei i liniei n care se afl data. Sistemul de baze de date relaionale Oracle pune la dispoziie o baz de date care este uor de neles, de utilizat i suficient de flexibil pentru a satisface toate cerinele bazei de date. Aceast baz de date este un sistem deschis i respect standardele industriale referitoarele la limbajele de accesare a bazelor de date (SQL). n aceast lucrare, au fost prezentate etapele necesare pentru pornirea i oprirea bazei de date Oracle. De asemenea, ai aflat semnificaia termenului relaional, i anume: o colecie de tabele care sunt asociate ntre ele pe baza unei coloane comune.
10
Spaii-tabel
Atunci cnd o baz de date este creat de administratorul bazei de date, este mprit n uniti logice multiple numite spaii-tabel. Datele bazei de date sunt stocate logic n spaiul-tabel, iar fizic sunt stocate n fiierele de date care sunt asociate cu spaiul-tabel. 11
n afar de stocarea logic a datelor, administratorul bazei de date poate folosi spaii-tabel pentru a realiza urmtoarele: - controlul consumrii spaiului fizic de pe disc de ctre baza de date; - alocarea anumitor cote de disc utilizatorilor individuali; - stabilete repartiia stocrii datelor ntre dispozitive fizice multiple de stocare. Atunci cnd este creat un spaiu-tabel, sunt create automat spaiultabel System i fiierele de date. Spaiul-tabel System conine ntregul dicionar de date al bazei de date. Se recomand s fie creat cel puin un spaiu-tabel suplimentar pentru a pstra informaiile dicionarului de sistem separat fa de date. Utilizarea spaiilor-tabel multiple asigur flexibilitate n executarea operaiilor asupra bazei de date. Printre avantajele utilizrii spaiilortabel multiple se numr urmtoarele: - separarea datelor de sistem fa de datele utilizatorului; - permite separarea aplicaiilor ntre ele; - posibilitatea dezactivrii anumitor spatii-tabel individuale i meninerea celorlalte active; - posibilitatea de a stoca spaii-tabel diferite pe uniti de disc distincte n vederea mbuntirii performanelor i reducerii conflictelor de acces la date. Spaiul-tabel System conine, de asemenea, segmente de revenire si uniti de program PL/SQL cum ar fi funcii-procedur, declanatori i pachete. Dac pentru o anumit baz de date este creat o asemenea unitate PL/SQL, administratorul bazei de date trebuie s aib n vedere necesitile de spaiu aferente. Prin urmare, administratorul bazei de date va aloca mai mult spaiu pentru baza de date. Spaiul-tabel System trebuie s fie ntotdeauna pstrat activ, deoarece Oracle trebuie s aib oricnd acces la dicionarul de date. Un spaiu-tabel Oracle este pstrat de obicei activ (online) astfel, nct datele pe care le conine s fie accesibile tuturor utilizatorilor bazei de date. Administratorul bazei de date poate s dezactiveze spaiul-tabel (offline) pentru oricare dintre urmtoarele motive: - pentru a efectua operaiuni de ntreinere sau copii de siguran (backup) ale bazei de date; - pentru a interzice accesul la un grup de tabele n timpul actualizrii sau modificrii unei aplicaii; 12
- pentru a interzice accesul la o poriune a bazei de date n timp ce restul bazei de date rmne activ (online). Oracle mpiedic executarea instruciunilor SQL care fac referire la spatiile-tabel dezactivate. Orice tranzacie SQL activ care face referire la spatiile-tabel dezactivate va fi finalizat normal. Integritatea datelor se pstreaz n segmentele de revenire (rollback segments) pentru aceste segmente SQL active. Un spaiu-tabel nu poate fi dezactivat dac exist un segment de revenire activ care face referire la el. Segmentul de revenire trebuie rezolvat nainte ca spaiul-tabel s poat fi trecut n stare inactiv. Un spaiu-tabel dezactivat nu poate fi citit sau manipulat de nici o alt aplicaie sau utilitate alta dect Oracle. Spaii-tabel i fiiere de date Fiecare spaiu-tabel conine cel puin un fiier fizic de date. Fiierul de date asociat cu un spaiu-tabel conine datele pentru spaiul-tabel respectiv. Fiierele de date sunt asociate cu un singur spaiu-tabel i o singur baz de date. Fiierul de date iniial al fiecrei baze de date este destinat pstrrii spaiului-tabel System. Acest fiier este necesar pentru pstrarea dicionarului de date i a segmentului de revenire ce trebuie s aib o dimensiune iniial de cel puin 2KB. Pe msur ce dimensiunea bazei de date crete, putei aduga spaiului-tabel fiiere de date suplimentare. n general, ideal este s adugai mai degrab puine fiiere de date de dimensiuni mari dect mai multe fiiere de date de dimensiuni mai mici. Spaiul-tabel i fiierul de date asociat sunt goale n momentul n care sunt create. Cu toate acestea, ele posed spaiu alocat n vederea pstrrii datelor viitoarei baze de date. n vederea pstrrii acestor date, n spaiul-tabel sunt create segmente de date. Atunci cnd este creat un segment ntr-un spaiu-tabel sau cnd dimensiunea acestuia crete, programul Oracle utilizeaz spaiul liber din fiierul de date asociat pentru a aloca extinderi pentru segmentul respectiv. Remarcai faptul c un obiect logic de stocare nu corespunde unui anumit fiier de date. n schimb, un fiier de date este depozitarul datelor oricrui obiect dintr-un anumit spaiu-tabel.
13
Segmente Segmentele sunt omoloagele fizice ale obiectelor bazei de date care stocheaz datele. Un segment este format din extinderi. Spaiul alocat segmentelor nu este eliberat dect atunci cnd segmentul este abandonat sau trunchiat. Oracle definete patru tipuri de segmente: - segmentul tabel; - segmentul index; - segmentul de revenire; - segmentul temporar Segmentul tabel Segmentul tabel, cunoscut i sub numele de segment de date, stocheaz datele din tabele, clustere i instantanee. Acest tip de segment este creat indirect prin intermediul comenzilor create table/cluster/snapshot De obicei, segmentul tabel este foarte activ deoarece aici sunt pstrate datele. Aceste date sunt manipulate de un mare numr de tranzacii SQL. Pentru obinerea unor performane corespunztoare, este important ca administratorul bazei de date s aloce cantitatea adecvat de spaiu de stocare pentru fiecare segment. Dac segmentul acumuleaz continuu noi extinderi, datele devin fragmentate, iar performanele scad. Baza de date nu poate garanta alocarea contigu a extinderilor. Comanda pctfree poate fi folosit pentru a monitoriza cantitatea de spaiu liber pe care o posed un segment. Acest spaiu liber poate fi utilizat intern pentru spaiul-tabel sau poate fi eliberat i returnat bazei de date. Segmentul index Segmentul index este creat pentru a pstra datele unui index al bazei de date. Sintaxa: create index Aceast comand v permite s definii parametrii extinderilor segmentului index i spaiului-tabel n care va fi creat indexul. Segmentul de revenire Segmentul de revenire este o poriune a bazei de date care nregistreaz aciunile unei tranzacii SQL n vederea derulrii napoi a acestora dac se dorete acest lucru. Un segment de revenire restabilete 14
baza de date n starea n care se gsea la ultimul punct de salvare sau la ultima acceptare. Fiecare tranzacie are un segment de revenire asociat. De obicei, acest segment este atribuit automat de ctre baza de date. Avei totui posibilitatea s asociai o tranzacie cu un segment de revenire corespunztor. Segmentul de revenire conine mai multe informaii. Printre acestea se numr numele fiierului i identificatorul blocului pentru datele care au fost modificate i pentru datele existente naintea ultimei tranzacii. Aceste segmente de revenire pot fi citite i scrise exclusiv de ctre programul Oracle. Segmentul temporar Un segment temporar este un spaiu de lucru destinat prelucrrii unui tabel utilizat pentru pstrarea rezultatelor intermediare ale unei tranzacii SQL. De exemplu, pentru o operaie de sortare va fi creat un segment temporar reprezentnd zona de lucru pentru aceast operaie. Urmtoarele comenzi SQL pot necesita crearea unui segment temporar: Create index Select order by Select distinct Select minus Select intersect Extinderi O extindere este o structur logic de stocare compus dintr-un numr de blocuri contigue. Fiecare tip de segment este compus din una sau mai multe extinderi. Atunci cnd un segment epuizeaz spaiul de stocare care i-a fost alocat, programul Oracle i aloc o nou extindere. Atunci cnd este creat, fiecare segment posed cel puin o extindere. La alocarea unei noi extinderi pentru un segment, se parcurg urmtoarele etape: 1. Programul Oracle parcurge spaiul-tabel n cutarea primului set contiguu de blocuri de date libere care au mpreun dimensiunea incrementului stabilit pentru o extindere. 2. Programul Oracle gsete spaiul liber necesar i aloc extinderii respective o poriune a acestui spaiu liber egal cu incrementul unei extinderi. 3. Dicionarul de date este actualizat pentru a reflecta alocarea noii extinderi i faptul c spaiul alocat nu mai este liber. 15
Extinderile segmentelor pot fi returnate atunci cnd nu mai sunt necesare. n general, extinderile nu sunt returnate spaiului-tabel ca spaiu liber pn cnd segmentul nu este returnat ca un ntreg. Acest lucru survine, de exemplu, atunci cnd un tabel este abandonat, iar segmentele i extinderile sunt eliberate. Atunci cnd sunt eliberare segmente, dicionarul de date este actualizat pentru a reflecta extinderile recuperate ca reprezentnd spaiu disponibil. Datele din blocurile extinderilor eliberate nu mai sunt accesibile. Blocuri de date Blocul de date reprezint cea mai mic unitate de stocare utilizat de programul Oracle pentru stocarea datelor. Un bloc de date corespunde unui bloc fizic de octei de pe disc. n interiorul fiierelor de date spaiul de stocare este compus din blocuri de date. Formatul blocurilor de date Oracle este identic, indiferent dac blocul de date conine un tabel, un index sau clustere de date. Blocurile de date includ urmtoarele componente: - antetul - conine informaii referitoare la bloc cum ar fi adresa blocului i tipul segmentului; - catalogul de tabele - conine informaii despre tabele care posed linii n blocul respectiv; - catalogul de linii - conine informaii despre liniile din bloc; - spaiu liber - folosit pentru inserarea noilor linii i pentru actualizarea liniilor care necesit spaiu suplimentar. - linii de date - conine date aparinnd unor tabele sau unor indeci. Programul Oracle permite liniilor de date s se ntind pe spaiul mai multor blocuri. Spaiul alocat liniilor de date nu este eliberat de server atunci cnd sunt terse linii. Acest spaiu este reutilizat numai atunci, cnd sunt inserate noi linii n blocul respectiv. Pentru controlul utilizrii spaiului liber al blocului de date, proiectantul aplicaiei are la dispoziie doi parametri, pctfree i pctused. Ambii parametri pot fi specificai numai n momentul crerii sau modificrii tabelelor i clusterelor. Parametrul pctfree este folosit pentru a defini procentajul blocului de date care urmeaz s fie pstrat liber pentru eventualele actualizri ale liniilor care exist deja n blocul de date respectiv. Parametrul din exemplul urmtor, atunci cnd este folosit mpreun cu 16
comanda create table, va rezerva 35 de procente din blocul de date utilizat pentru tabelul respectiv ca spaiu liber pentru eventualele actualizri viitoare: pctfree 35 Parametrul pctused este folosit pentru a defini procentul din spaiul existent n blocul de date pe care programul Oracle va ncerca s-1 completeze nainte de a aloca o nou extindere. Parametrul din exemplul care urmeaz, atunci cnd este folosit mpreun cu comanda create table, specific programului Oracle s nu insereze alte linii n blocul de date dac nu sunt libere cel puin 40 de procente din acesta: pctused 40 Parametrii pctfree i pctused sunt folosii mpreun pentru a optimiza utilizarea spaiului din blocurile de date i extinderile unui segment de date.
Mersul lucrrii:
1. Activai comanda SQL*PLUS 2. Introducei numele de sistem SYSTEM i apsai [Enter]. SQL*PLUS va afia "Enter password:". 3. Introducei parola MANAGER i apsai [Enter] din nou. 4. Introducei comanda pentru a avea fiierul spooller: spool c:\1\trace2 Crearea noilor spaii-tabel i a fiierelor de date Pentru a crea un nou spaiu-tabel trebuie s posedai privilegiul de sistem create tablespace. Instruciunea care urmeaz creeaz un spaiu-tabel numit dbt_user_01. create tablespace dbt_user_01 datafile 'c:\1/datafile_01' size 256k default storage ( initial 50k next 40k minextents 10 maxextents 50 pctincrease 0) ; Rezultatul: Tablespace created. 17
Urmtorul exemplu va aduga un nou fiier de date la un spaiu-tabel existent numit dbt_user_01: alter tablespace dbt_user_01 add datafile 'c:\1/new_file_name_2' size 512k; Rezultatul: Tablespace altered. Afiarea informaiilor spaiilor-tabel i ale fiierelor de date Oracle prevede mai multe vederi predefinite care v permit s obinei informaii despre spaiile-tabel i fiierele de date. Iat numele acestor vederi: Dba_tablespaces user_tablespaces dba_data_files user_extents user_segments dba_extents Urmtorul exemplu utilizeaz vederea dba_tablespace pentru a obine informaiile de stocare prestabilite pentru spaiul-tabel dbt_user_0l: select tablespace_name tablespace, initial_extent extent, next_extent next_ext, min_extents min_ext, max_extents max_ext, pct_increase pct_incr, status status from sys.dba_tablespaces; Rezultatul:
tablespace extent next_ext min_ext max_ext pct_incr status -------------------- -------- ---------------- -------- -----SYSTEM 10240 10240 1 121 50 ONLINE USER_DATA 10240 10240 1 121 50 ONLINE ROLLBACK_DATA 10240 10240 1 121 50 ONLINE TEMPORARY_DATA 10240 10240 1 121 50 ONLINE DBT_USER_01 51200 40960 10 50 0 ONLINE
18
Privii aceste vederi, pentru a dobndi o impresie de ansamblu a spaiilor-tabel i fiierelor dumneavoastr de date curente.
Rezumat
Structurile logice de stocare creeaz modelul de date relaional n baza de date fizic. Aceste structuri definesc modul n care va fi utilizat baza de date fizic. Structurile logice de stocare sunt necesare pentru ca administratorul i proiectantul bazei de date s maximizeze eficiena bazei de date. De asemenea, aceste structuri sunt folosite pentru a optimiza utilizarea spaiului de pe disc prin reducerea redundanei datelor. Baza de date Oracle este mprit n uniti logice numite spaiitabel. Datele bazei de date sunt stocate n fiiere de date. Un spaiu-tabel posed cel puin un segment pentru stocarea datelor bazei de date. Fiecare segment este compus din extinderi. O extindere este format din uniti contigue de spaiu de stocare numite blocuri de date.
5. Crearea bazei de date relaionale. Crearea unui model activitii companiei Aceast etap presupune strngerea de informaii despre activitatea companiei pe care le va susine baza de date Oracle. Pentru a dobndi o bun cunoatere a activitii companiei, vei ntreprinde urmtoarele: Vei lua interviuri: a. Managerilor i supervizorilor activitilor companiei. b. Potenialilor utilizatori. c. Potenialilor beneficiari. Descoperii obiectivul declarat al activitii. Este util s cunoatei scopurile activitii unei companii astfel, nct baza de date s fie conceput n vederea deservirii acestora. Colaborai cu utilizatorii i supervizorii pentru a defini obiectivul aplicaiei. Este obligatoriu s definii preteniile companiei referitoare la ceea ce urmeaz s fac baza de date i aplicaia. Analizai specificaiile de sistem curente. Identificai viitoarele specificaii de sistem pentru baza de date. n acest moment, vei fi n posesia unor cantiti mari de date. Este necesar s nelegei toate aceste informaii i s le ordonai nainte de a trece la etapa urmtoare. Crearea unui model al datelor Dup ce ai strns informaiile precedente, trebuie s construii un model sau o reprezentare grafic a necesitilor i regulilor companiei. De exemplu, s presupunem c ai aflat urmtoarele informaii despre activitatea companiei n timpul interviurilor anterioare: Compania are nevoie s tie ce agent de vnzri deservete fiecare client. De asemenea, trebuie s cunoasc numele i telefonul clientului. Vor s aib posibilitatea de a gsi rapid informaii despre un anumit client. O tehnic de modelare verificat pentru reprezentarea grafic a activitilor companiilor este modelul ERD (Entity Relationship Diagram - diagrama relaiei dintre entiti). Acest model este format din trei componente: entitate - un element relevant n legtur cu care sunt necesare informaii; atribut - ceva care descrie sau explic o entitate; 20
relaie - o asociere ntre dou entiti. Numai elementele relevante pentru activitatea companiei devin entiti. Orice descrieri ale unei entiti devin atributele acesteia. Informaiile pe care le-ai obinut privitor la activitatea companiei trebuie s descrie relaiile ntre entiti. Ducnd acest exemplu mai departe, vom crea o diagram ERD simpl. Consultai fig. 3.1 pentru un exemplu de diagram a relaiilor dintre entiti. Informaii obinute n prima etap
... Trebuie
Fig. 3.1. O diagrama simpl a relaiilor dintre entiti. Dup ce ai creat diagram ERD iniial, analizai-o mpreun cu responsabilii de compartimente pentru a v asigura c ea este corect i a o mbunti dac este cazul. Printre avantajele utilizrii diagramei ERD se numr urmtoarele: diagrama ERD documenteaz cerinele informaionale ale companiei ntr-un format clar i precis; aceast abordare grafic a modelrii o face uor de neles; simplitatea modelului l face uor de utilizat.
ilustreaz modul n care diagrama ERD poate fi convertit n schema unei instane a unei baze de date standard. Client Nume telefon
ID PK NN nbr 7 1
Nume NN
telefon vnzri_rep_id
Vasile 5551231
Fig. 3.2 Conversia diagramei ERD n schema instanei. Crearea definiiei unui tabel Schema instanei este compus din rnduri care definesc caracteristicile critice ale bazei de date. Entitile din diagrama ERD devin tabele; atributele devin coloane ale acestor tabele; iar relaiile devin chei externe. Dup finalizarea acestei scheme, analizai-o din nou cu responsabilii de compartimente pentru a v asigura c este complet i corect. n Oracle, pentru crearea tabelelor fizice, este folosit instruciunea SQL create table. Mulimea acestor tabele, mpreun cu consideraiile privind securitatea, reprezint fundamentul bazei de date relaionale. Figura 3.3 ilustreaz ct de uor poate fi modelat instruciunea create table pornind de la tabelul schemei de instan. 22
ID PK NN
nume NN
telefon
rep_vanzari_id
Vasile 5551231
create table client_vanzari (id number(7), nume varchar2(30) constraint s_client_nume_nn not null, tel varchar2(12), rep_vanzari_id number(7) constraint s_client_pk_id pirimary key(id)); Fig. 3.3. Utilizarea schemei de instan ca baz pentru instruciunea create. Crearea unei baze de date relaionale Acum este momentul pentru a crea tabelul. Crearea unui tabel se realizeaz prin definirea numelui tabelului, precum i a numelor coloanelor tabelului i a descrierii acestora folosind o instruciune SQL. Urmtoarea instruciune creeaz tabelul prezentat n figurile anterioare: create table client_vanzari( id number(7,0), nume varchar2(30) constraint s_client_nume_nn not null, tel varchar2(12), rep_vanzari_nr_marca number(7), constraint s_client_pk_id primary key (id)); 23
Odat ce aceast instruciune a fost lansat prin intermediul programelor SQL*PLUS sau SQL*DBA, tabelul exist fizic n baza de date relaional Oracle.
Normalizarea datelor
Normalizarea este procesul prin care eliminai problemele legate de redundana datelor n proiectul bazei de date i construii un model de date care susine diverse cerine funcionale i structuri alternative ale bazei de date. Normalizarea este un proces ordonat n care aplicai urmtoarele trei reguli referitoare la date: Toate atributele trebuie specificate o singur dat. Aceasta este forma 1 normal. Aceasta nseamn c atributele nu trebuie s se repete. Un atribut trebuie s depind n ntregime de identificatorul (ID) unic al entitii pe care o descrie. Aceasta este forma normal 2. Mutai atributele ntr-un tabel n care depind exclusiv de o cheie principal. Nu utilizai tabele n care atributele s nu depind exclusiv de o singur cheie. Pentru a fi n forma normal 3, o relaie trebuie s fie n forma normal 2, iar atributele ID nu trebuie s depind tranzitiv de cheia primar. Atunci cnd normalizarea este complet, fiecare tabel trebuie s posede o singur cheie primar, iar datele din tabel trebuie s depind exclusiv de cheia primar a tabelului. Repetai de sine stttor procedura de creare a unui tabel pornind de la un model propriu , explicai fiecare operator utilizat.
Rezumat
Proiectarea bazei de date presupune parcurgerea mai multor etape pentru a colecta, a analiza i a modela informaiile referitoare la activitatea companiei. In acest capitol, au fost prezentate etapele necesare analizrii i modelrii datelor. Proiectarea judicioas a bazei de date este necesar deoarece n lipsa ei performanele ar avea de suferit, integritatea datelor ar fi n pericol, iar baza dumneavoastr de date ar deveni prea mare datorit acumulrii de date duplicate. nsuirea artei de a proiecta o baz de date presupune acumularea unei experiene ndelungate. Cu toate acestea, parcurgnd etapele 24
prezentate n acest capitol, putei construi o baz de date solid i bine conceput.
La definirea coloanei i atribuie lungimea fix specificat de dumneavoastr, iar la inserarea unei valori aceasta este ajustat pentru a o aduce la lungimea respectiv. Dac valoarea introdus este mai scurt dect lungimea de definiie a coloanei, valorii i sunt adugate spaii. Dac valoarea introdus este mai lung dect lungimea de definiie a coloanei, Oracle returneaz un cod de eroare. Dac valoarea care depete lungimea coloanei posed spaii la sfrit, acestea sunt eliminate pentru a aduce data la lungimea fixat, iat un exemplu de definire a unei coloane de tip char: Nr Articol char(15) Exemplu: "RX22723Y1 " Tipul varchar2 Tipul varchar2 este utilizat pentru a defini o coloan care conine iruri de caractere de lungime variabil, n domeniul 1-2000 octei. Pentru o coloan definit ca fiind de tip varchar2, fiecare dat este stocat ca dat de lungime variabil. Atunci cnd utiliznd tipul varchar2 pentru a defini o coloan, Oracle efectueaz urmtoarele operaii: La definirea coloanei i atribuie lungimea maxim specificat de dumneavoastr, iar la inserarea unei valori aceasta este de lungime variabil. Dac valoarea introdus este mai scurt dect lungimea de definiie a coloanei, nu sunt adugate spatii la sfritul valorii. Acesta este un tip de date n care valorile nu sunt completate cu spaii. Dac valoarea introdus este mai lung dect lungimea de definiie a coloanei, programul Oracle returneaz un cod de eroare. Dac valoarea care depete lungimea coloanei posed spaii la sfrit, acestea sunt eliminate pentru a aduce data la lungimea maxim fixat. n exemplul care urmeaz, coloana Nr_Articol este definit ca fiind de tip varchar2 i avnd o lungime maxim de 15 octei: Nr_Articol varchar2(15) Exemplu: "RX22723Y1" Tipul varchar n versiunea Oracle 7.1, tipul varchar este sinonim cu tipul varchar2. 26
Tipul number Datele de tip number stocheaz numere n virgul fix i n virgul mobil. Practic pot fi stocate numere orict de mari. Tipul number permite definirea preciziei i a scalei. Precizia este egal cu numrul total de cifre ale numrului; scala se refer la numrul de cifre din dreapta punctului zecimal. Aceste numere pot fi stocate cu o precizie de pn la 38 de cifre. Exemplul urmtor ilustreaz definirea unei date de tip number: Nr_Articol number Exemplu: '336100' sau Nr_Articol number(6,2) Exemplu: '3361.00' In acest exemplu, (6,2) reprezint urmtoarele: 6 este precizia. Precizia este sinonim cu numrul total de cifre permise. Acest numr include numrul total de cifre din ambele pri ale punctului zecimal. 2 este scala, sau numrul de cifre din dreapta punctului zecimal. Este recomandabil s specificai ntotdeauna precizia i scala datei. n acest fel se asigur verificarea integritii datei atunci, cnd aceasta este introdus. Tipul date Tipul date stocheaz data calendaristic si ora n coloanele unui tabel cu precizie de o secund. Acest tip de dat stocheaz cele patru cifre ale anului, luna, ziua, ora, minutele i secundele scurse de la miezul nopii. Pentru operaiile de intrare/ieire de date, formatul prestabilit este DD-MON-YY. Ora este stocat n format HH:MM:SS. Nu putei specifica data n litere. Dac nu specificai componenta pentru or ntr-o valoare de tip dat, ora prestabilit este 12:00:00 AM. n mod similar, dac omitei componenta corespunztoare datei calendaristice a unei valori de tip dat, data prestabilit este prima zi a lunii curente. Domeniul valid pentru date calendaristice este 1 Ianuarie 4712 .E.N - 1 Ianuarie 4712 E.N. Pentru alte informaii despre: Formate pentru date calendaristice; Modificatori de format, Sufixuri de formatare a datelor; Operaii 27
aritmetice cu date calendaristice, consultai literatura de specialitate, subiectul fiind prea amplu pentru a fi expus aici. Tipul long Coloanele, variabilele i constantele de tip long stocheaz date caracter cu lungime variabil coninnd pn la 2 gigaoctei de informaie. Dei tipul de date long este util n numeroase situaii, el prezint urmtoarele limitri: ntr-un tabel este permis cel mult o coloan de tip long Coloanele de tip long nu pot fi indexate Coloanele de tip long nu pot aprea n restricii de integritate Nu se pot face referiri la coloane de tip long n funcii SQL cum sunt substr, length i aa mai departe Coloanele de tip long nu pot fi utilizate n clauzele where, group by, order by i connect by n uniti de program PL/SQL nu pot aprea variabile sau argumente de tip long Tipurile raw i longraw Aceste tipuri de date sunt destinate datelor binare. Ele nu trebuie utilizate atunci cnd datele urmeaz s fie interpretate de Oracle. Aceste tipuri de date sunt ideale pentru stocarea datelor multimedia sau a altor fiiere binare. Tipul raw este similar cu tipul varchar2, iar long raw este similar cu tipul long. Singura deosebire este c datele de tip raw nu fac obiectul operaiunilor de conversie la atribuire. Datele de tip raw pot fi indexate, n timp ce datele de tip long raw nu pot fi indexate. Tipul rowid Tipul de date rowid corespunde adresei fizice a unei linii dintr-un tabel Oracle care nu aparine unui cluster. El este un identificator unic al fiecrei linii. Fiecare tabel al unei baze de date Oracle posed propria coloan rowid, pe care ns nu o vei vedea afiat atunci cnd executai o instruciune select * from sau describe. Adresa fiecrei linii poate fi citit prin intermediul unei interogri SQL n care este folosit cuvntul rezervat rowid drept nume de coloan. Exemplul urmtor 28
ilustreaz o instruciune SQL care utilizeaz tipul de date rowid, precum i valorile de ieire ale acesteia: SELECT rowid, nume_ang FROM ang; Rezultatul: rowid NUME_ANG -----------------------------000C0B7.0000.0001 'WHITE' Aceast adres rowid se traduce n felul urmtor: 000C0B7 Acesta este blocul de date care conine linia. Numerele blocurilor sunt relative la fiierul de date la care aparin i nu la spaiul-tabel. 0000 Acesta este numrul de secven al liniei n bloc. Numrul primei linii este ntotdeauna 0. 0001 Acesta este numrul fiierului de date care conine linia. Tipul mlslabel Tipul mlslabel este utilizat pentru stocarea formatului binar al unei etichete a sistemului de operare. Lungimea maxim pentru datele de acest tip este de 255 octei.
Conversii de tip
n anumite situaii, programul Oracle convertete automat datele de la un tip la altul. Pe de alta parte, pentru a converti datele n mod explicit putei folosi urmtoarele funcii Oracle: to_char() to_date() to_number() to_label() chartorowid() rowidtochar() Pentru atribuiri, programul Oracle efectueaz n mod implicit urmtoarele conversii de tip: varchar2 sau char la number number la varchar2 varchar2 sau char la date date la varchar2 varchar2 sau char la rowid rowid la varchar2 Conversia la atribuire reuete dac Oracle poate converti tipul valorii care urmeaz s fie atribuit la tipul destinaiei atribuirii. Pentru 29
evaluarea expresiilor, Oracle efectueaz n mod implicit urmtoarele conversii de tip: varchar2 sau char la number varchar2 sau char la date Conversiile char la number reuesc numai dac rezultatul de tip ir de caractere reprezint un numr valid. Conversiile char la date reuesc numai dac rezultatul de tip ir de caractere are formatul de dat prestabilit DD-MON-YY. Tipul null null nu este un tip de dat Oracle, ns este un concept important legat de valoarea datelor. Valorile null pot aprea n coloanele tabelelor i n expresii SQL. null se definete ca o valoare care este necunoscut, fr sens sau irelevant. Valorile null pot aprea n orice coloan att timp ct aceasta nu este supus restriciilor de integritate not null sau primary key. Nu confundai valoarea zero cu null. Zero este un numr i are o semnificaie. Exemplul urmtor ilustreaz o instruciune select care va selecta orice nregistrare n care valoarea coloanei sold nu este null. SELECT nr_cont, nume_cont, sold FROM conturi WHERE sold IS NOT null;
Tabele 1
Tabelele reprezint structurile fundamentale de stocare a bazelor de date relaionale Oracle. Tabelele sunt compuse din linii i coloane. O coloan conine date de un singur tip despre o anumit entitate. Un exemplu de coloan ar putea fi nume sau ora. O linie este o colecie de date pentru fiecare coloan a unui tabel. De exemplu, o linie a unui tabel care conine coloanele nume_oras i nume_stat ar putea fi Chisinau" i Moldova". Un tabel are un numr fixat de coloane predefinite i mai multe linii. Numrul de linii poate varia de la 0 la un numr practic nelimitat. Tabelul Oracle poate fi folosit pentru pstrarea informaiilor despre o singur entitate. Un asemenea tabel ar putea s conin o list a numelor salariailor sau o list a numerelor departamentelor din 30
companie. De asemenea, un tabel poate ilustra relaia dintre un angajat i numrul departamentului la care aparine. O baz de date relaional stocheaz datele n uniti logice de stocare numite tabele. Utilizarea tabelelor prezint urmtoarele avantaje: - baza de date devine mai uor de neles datorit structurii simple a tabelelor; - relaiile dintre datele situate n diverse tabele sunt uor de stabilit; - regulile de integritate se pot construi rapid; - tabelele reduc necesarul de spaiu de stocare i redundana datelor; - putei da nume sugestive pentru tabele i coloane, mbuntind claritatea bazei de date. Dup ce ai creat un tabel, putei s inserai linii de date n el folosind instruciuni SQL. n continuare, informaiile stocate n tabel sunt disponibile n vederea interogrii, actualizrii i eliminrii.
Utilizarea tabelelor
Planificarea tabelelor
De obicei, stabilirea parametrilor de stocare i definirea clusterelor pentru tabele cad n sarcina administratorului bazei de date. Acesta trebuie s utilizeze informaiile provenind de la creatorul aplicaiei, privind modul de utilizare a aplicaiei i tipurile de date necesare efecturii diverselor sarcini. n continuare sunt enumerate aspectele generale care trebuie avute n vedere atunci, cnd intenionai s creai un nou tabel. Tabelele trebuie s fie normalizate. Coloanele care permit valori nule vor fi definite ultimele pentru a conserva spaiul de stocare. Grupai tabelele n clustere ori de cte ori este posibil. Specificai valori adecvate pentru parametrii pctfree i pctused n momentul crerii tabelului. Specificai parametrii initrans i maxtrans n momentul crerii tabelului. Specificai spaiul-tabel n care vor fi pstrate tabelele. Estimai dimensiunea tabelului i specificai parametrii de stocare. Folosii, aceste estimri pentru a stabili resursele necesare de procesare i de spaiu de stocare pe disc. 31
n cazul n care constatai c vei avea tabele foarte mari, de genul celor cu milioane de linii, trebuie s luai anumite msuri de precauie. Dac tabelul urmeaz s creasc n timp ajungnd la dimensiuni foarte mari, asigurai-v c extinderile acestuia sunt suficient de mari astfel, nct segmentul s nu aib prea multe extinderi. n cazul tabelelor foarte mari trebuie avute n vedere nc dou aspecte: pe de o parte, specificai parametrii de stocare astfel, nct tabelul i indecii lui s se gseasc n spaii-tabel diferite; pe de alt parte, alocai suficient spaiu temporar pentru aciuni, cum ar fi sortarea.
A = totalul lungimii tuturor coloanelor care stocheaz 250 de octei sau mai puin. B = totalul lungimii tuturor coloanelor care stocheaz 250 de octei sau mai mult. C = spaiul de date combinat al tuturor coloanelor (calculat n etapa 3). 5. Determinai numrul mediu de linii per bloc cu urmtoarea formul: numr mediu de linii/bloc = spaiu disponibil/dimensiunea medie a liniei. Spaiul disponibil este cel calculat n etapa 2, iar dimensiunea medie a liniei este cea calculat n etapa 4. 6. Calculai numrul de blocuri cu urmtoarea formul: numr de blocuri = numr de linii/numrul mediu de linii per bloc. Numrul mediu de linii per bloc a fost determinat n etapa 5.
Proiectarea tabelelor
Prima etap pentru crearea unui nou tabel Oracle o reprezint proiectarea tabelului. Iat cteva aspecte care trebuie avute n vedere la proiectarea unui tabel: - folosii nume sugestive pentru tabel i pentru coloane; - selectai tipul de date adecvat pentru fiecare coloan; - normalizai tabelele atunci cnd este posibil; - definii la sfrit coloanele care accept valori nule pentru a conserva spaiul de stocare; - nu uitai s documentai numele tabelului i scopul acestuia folosind comanda comment; - creai un tabel pentru relaii i un tabel distinct pentru date. nainte de a crea un tabel, trebuie s stabilii dac sunt necesare restricii de integritate. Putei defini restriciile de integritate pentru coloanele unui tabel pentru a impune automat anumite reguli de utilizare pentru baza de date. De exemplu, dac avei un tabel care conine informaii referitoare la angajai, putei folosi restricia de integritate not null pentru coloana nume_ang. Prezena acestei restricii va obliga utilizatorul s insereze o valoarea n aceast coloan pentru fiecare linie a tabelului. Not. n exemplul urmtor procedurile de Planificare a tabelelor i Calcularea dimensiunii tabelului nu sunt utilizate fiind utilizat spaiul predefinit al sistemului. 33
Crearea tabelelor
Pentru a crea un tabel, creai un script SQL folosind comanda create table. Sintaxa general a comenzii pentru a crea un tabel este urmtoarea: create table tablename (nume_coloana tip_data restrictie, (nume_coloana tip_data restrictie) Numele tabelelor i ale coloanelor pot fi formate din 1 pn la 30 de caractere. Primul caracter trebuie s fie o liter. Numele tabelului nu poate fi numele unui alt obiect deinut de acelai utilizator al serverului Oracle. O restricie este o regul care limiteaz valorile datelor pentru una sau mai multe coloane ale unui tabel.
Mersul lucrrii:
1. Activai comanda SQL*PLUS 2. Introducei numele parola de SCOTT 3. Introducei parola TIGER i apsai [Enter]. 4. Introducei comanda pentru a avea fiierul spooller: c:\1\trace4 5. Introducei urmtorul script: /* crearea tablei Angajati */ drop table Angajati;
spool
create table Angajati( nas char(9), nume varchar2(9), prenume varchar2(9), sexe char(1) not null constraint c_constraint_sexe check(sexe in ('F', 'M')), ani number(2,0) null constraint c_constraint_ani check (ani >18 and ani < 65), angajat Date not null, nr_usinei char(3), nr_postului varchar2(6) not null );
34
Rezultatul: Table created. Descrierea tabelei describe Angajati; Rezultatul: Name Null? Type ----------------- -------- ---NAS CHAR(9) NUME VARCHAR2(9) PRENUME VARCHAR2(9) SEXE NOT NULL CHAR(1) ANI NUMBER(2) ANGAJAT NOT NULL DATE NR_USINEI CHAR(3) NR_POSTULUI NOT NULL VARCHAR2(6) Explicai fiecare rnd introdus i returnat.
Rezumat
n aceast lucrare, ai fcut cunotin cu tipurile de date Oracle ca reprezentnd caracteristicile datelor i cu tabelele, care sunt structurile logice de stocare fundamentale ale bazei de date relaionale Oracle. Aceste caracteristici sunt un set predefinit de informaii care definesc felul i lungimea datei. Programul Oracle trateaz difereniat datele de tipuri diferite. Tipurile de date permit sistemului Oracle s economiseasc spaiu de stocare prin adaptarea tipului datelor la datele care urmeaz a fi stocate. n plus, utilizarea tipurilor de date v permite s restrngei domeniul de valori pe care le poate conine o dat, contribuind astfel la asigurarea integritii datelor. Ai nvat s utilizai tipurile de date la definirea coloanelor, variabilelor i constantelor. n primul rnd stabilii tipul datelor pe care le vor conine, dup care definii lungimea acestora. Oracle efectueaz conversii de tip fie implicit, fie explicit. Aceste conversii sunt permise numai pentru anumite tipuri de date.
35
Culegei: drop table Ang; create table ang( marca_ang number(15) primary key, prenume varchar2(20) not null, nume varchar2(40) not null, nr_dept varchar2(12), data_ang date not null); marca_ang este definit drept cheie primar a tabelului. Scopul definirii unei chei primare este identificarea univoc a liniilor tabelului (coloana pentru care s-a definit o cheie primar nu poate conine valori duplicate). Restriciile not null impuse unora dintre coloane indic faptul c aceste coloane trebuie s conin o valoare pentru fiecare linie. Descrierea tabelului ang: Describe ang; Rezultatul: Name Null? Type ---------------- -------- ---MARCA_ANG NOT NULL NUMBER(15) 36
NOT NULL VARCHAR2(20) NOT NULL VARCHAR2(40) VARCHAR2(12) NOT NULL DATE
Distrugerea tabelelor
Pentru a elimina din baza de date un tabel mpreun cu toate datele acestuia, folosii comanda drop table. De exemplu, urmtoarea comand distruge tabelul ang: drop table ang; Pentru a distruge un tabel, acesta trebuie s se gseasc n schema dumneavoastr, n caz contrar, trebuie s posedai privilegiul de sistem drop any table. Distrugerea unui tabel are urmtoarele efecte: - definiia tabelului este eliminat din dicionarul de date, tabelul si datele devenind inaccesibile. Acest lucru este echivalent cu eliminarea efectiv a liniilor tabelului; - toi indecii i declanatorii asociai cu tabelul sunt distrui, indiferent dac sunt creai de dumneavoastr sau de alt utilizator; - vederile i sinonimele care fac referire la tabel nu sunt distruse ns devin invalide; - toate blocurile care au fost alocate tabelului sunt returnate spaiuluitabel ca spaiu liber i pot fi utilizate de orice alt obiect care necesit noi extinderi.
Trunchierea tabelelor
O metod eficient de a elimina toate liniile dintr-un tabel este s utilizai comanda truncate table. Aceast comand elimin toate nregistrrile din tabel i elibereaz spaiul alocat care era folosit pentru pstrarea nregistrrilor eliminate. Comanda truncate table este mai eficient i mai rapid dect comanda delete from. De obicei, utilizatorii ntmpin dou probleme atunci cnd ncearc s elimine volume mari de nregistrri cu comanda delete from. n primul rnd, ei risc s primeasc un mesaj de eroare prin care sunt avertizai c segmentul lor de revenire este prea mic. Aceasta este o fals eroare deoarece de obicei segmentul lor de 37
revenire este corect dimensionat, ns tranzacia este prea mare. n al doilea rnd, obiectul tabel pstreaz ntregul spaiu alocat atunci, cnd comanda delete from este finalizat. Programul Oracle nu elibereaz acest spaiu dup executarea acestei comenzi, deci ctigul de spaiu este nul. Comanda truncate table rezolv ambele probleme. Ea nu folosete segmentul de revenire n timp ce este executat. Prin urmare, este mai rapid i nu este limitat de spaiul segmentului. Folosirea comenzii truncate table duce la eliberarea spaiuluitabel imediat dup execuia acesteia. Comanda truncate table nu poate fi derulat napoi; prin urmare, trebuie s o folosii cu precauie n aplicaiile dumneavoastr. Pentru a folosi comenzile truncate table sau truncate cluster, tabelul, respectiv grupul trebuie s se gseasc n schema dumneavoastr sau trebuie s posedai privilegiul de sistem delete any table. n exemplul urmtor, comanda truncate table este folosit pentru a elimina toate liniile din tabelul DEPT: truncate table ang;
Descrierea tabelei
Culegei: describe Angajati; Rezultatul: Name Null? Type --------------- -------- ---NAS CHAR(9) NUME VARCHAR2(9) PRENUME VARCHAR2(9) SEXE NOT NULL CHAR(1) ANI NUMBER(2) ANGAJAT NOT NULL DATE NR_USINEI CHAR(3) NR_POSTULUI NOT NULL VARCHAR2(6)
insert into Angajati values ('199487815', 'Dusca', 'Lucia', 'F', 38, to_date('12-mar-95', 'DD-MON-YY'), 'u18', 'ps410'); insert into Angajati values ('199665972', 'Vasilescu', 'Ion', 'M', 32, to_date('10-jan-95', 'DD-MON-YY'), 'u10', 'ps235'); insert into Angajati values ('199623961', 'Scutaru', 'Maria', 'F', 35, to_date('26-jan-96', 'DD-MON-YY'), 'u16', 'ps410'); /* */ /*************Sfarsitul datelor***************/ Observaie. Se acord o deosebit atenie formatului datei, dat fiind c el este legat de versiunea lingvistic a sistemului de operare. Afiarea (returnarea) tabelei Angajati Culegei: select * from Angajati; Rezultatul:
NAS --------199073432 198029823 199549525 199579013 199571002 199487815 199665972 199623961 NUME PRENUME S ANI ANGAJAT NR_ NR_POS --------- --------- - ---- --------- --- ----Rusu Dionis Bucatru Gurau Ionescu Dusca Vasilescu Scutaru Maria Pavel Felix christina Ilie Lucia Ion Maria F M M F M F M F 35 42 25 35 35 38 32 35 20-OCT-95 17-NOV-98 08-JAN-95 27-JAN-94 19-SEP-95 12-MAR-95 10-JAN-95 26-JAN-96 u12 u12 u14 u12 u14 u18 u10 u16 ps272 ps275 ps71 ps175 ps75 ps410 ps235 ps410
8 rows selected.
Modificarea tabelelor
Sistemul Oracle v permite s modificai orice tabel existent. Motivele pentru care ai putea dori s modificai un tabel sunt urmtoarele: - pentru a aduga una sau mai multe coloane unui tabel; - pentru a aduga sau a distruge restricii asociate unui tabel; - pentru a modifica parametrii pctused i pctfree; 40
- pentru a modifica definiia unei coloane existente (tipul de date i lungimea). Atunci cnd modificai definiiile coloanelor unui tabel, acesta trebuie s fie gol pentru a putea face urmtoarele operaii: - micorarea lungimii unei coloane; - modificarea tipului de date ale unei coloane. Mrirea lungimii unei coloane de tip char poate dura destul de mult. Aceasta deoarece tipul de date char face ca programul Oracle s completeze cu blancuri fiecare linie pentru coloana modificat. Pentru a modifica un tabel existent, folosii comanda alter table. Codul care urmeaz adaug o nou coloan tabelului dept: alter table dept add (profil_dept varchar2(35)); Urmtorul exemplu modific tabelul ANG, indicnd faptul c trebuie completat cmpul salariu: alter table emp modify (sal not null); Acest exemplu modific tabelul ANG prin adugarea unei restricii de tip cheie extern: alter table ang add constraint s_dept_man_id_fk foreign key (nr_dept) references dept; Acest exemplu elimin o restricie din tabelul DEPT: change dept to ang alter table dept drop constraint s_dept_man_id_fk; alter table emp Pentru a modifica un tabel, acesta trebuie s se gseasc n schema dumneavoastr; n caz contrar, trebuie s posedai fie privilegiul alter pentru tabelul respectiv, fie privilegiul de sistem alter any table.
Rezumat
n acest capitol, ai fcut cunotin cu tabelele, care sunt structurile logice de stocare fundamentale ale bazei de date relaionale Oracle. Tabelele pot fi privite ca matrice bi-dimensionale care conin un numr predeterminat de coloane i linii multiple. 41
Folosirea tabelelor este componenta esenial a utilizrii bazei de date relaionale Oracle. Tabelele furnizeaz o structura logic simplificat uor de neles i suficient de flexibil pentru a satisface cerinele bazei dumneavoastr de date. Ai parcurs etapele necesare crerii i modificrii tabelelor. Cu comanda create table, putei s optimizai spaiul de stocare, precum i s stabilii diverse restricii.
aplicaiile pot beneficia de aceste restricii globale, deci nu este necesar s repetai structurile logice echivalente n fiecare aplicaie. Toate restriciile au un nume. Putei denumi o restricie n timp ce o creai. Dac nu o facei, programul Oracle i va atribui un nume. Numele furnizat de utilizator trebuie s fie diferit de toate celelalte restricii care v aparin.
nume varchar2(20) constraint s_ang_nume_nn not null, prenume varchar2 (20), nr_dept varchar2(5)); n exemplul anterior a fost folosit comanda describe pentru a confirma restricia null. Pentru a afia alte restricii definite pentru un tabel, trebuie s folosii o alt abordare. Consultai paragraful Afiarea restriciilor de integritate" care urmeaz mai jos pentru a vedea care sunt metodele de confirmare a restriciilor unui tabel. Restricia de integritate unique este respectat de coloanele cu valori nule deoarece toate valorile nule sunt considerate unice i distincte din punctul de vedere al acestei restricii. In consecin, este recomandabil s plasai restricia not null pe coloanele cu valori unice. n acest fel forai introducerea unei valori pentru coloana respectiv si v asigurai c valorile sunt .cu adevrat distincte. In declaraia tabelului urmtor sunt adugate restriciile unique i not nuli pe coloana marca_ang: create table ang (marca_ang number(7) constraint s_ang_marca_ang_uk unique constraint s_ang_marca_ang_nn not null, nume varchar2(20) constraint s ang nume nn not null, prenume varchar2 (20) , nr_dept varchar2(5)); Restricia de integritate primary key Restricia de integritate primary key desemneaz o coloan sau o combinaie de coloane drept cheie principal a tabelului. Cheia principal identific n mod univoc fiecare linie a tabelului. De asemenea, aceast restricie creeaz n mod implicit restriciile not null i unique pe coloana respectiv. Dei Oracle nu impune existena unei chei principale pentru fiecare tabel, este bine s v obinuii s o creai. De asemenea, este recomandabil s desemnai drept cheie principal o coloana sau o combinaie de coloane ale cror valori nu se modific niciodat. 44
Instruciunea urmtoare creeaz o restricie primary key pentru cmpul marca_ang al tabelului ANG: create table ang (marca_ang number(7) constraint s_ang_marca_ang_pk primary key, nume varchar2(20) constraint s ang nume nn not null, prenume varchar2 (2'0'), nr_dept varchar2(5)); Pentru a crea restricii asupra tabelelor, putei folosi o a doua sintax, cunoscut sub numele de sintaxa restricie_tabel. Cu aceast sintax, restriciile sunt plasate la baza instruciunii create table. Exemplul urmtor creeaz acelai tabel ca n exemplul anterior, folosind sintaxa restricie_tabel: create table ang (marca_ang number(7), nume varchar2(20), prenume varchar2(20), nr_dept varchar2(5), constraint s_ang marca_ang_pk primary key (marca ang)); Sistemul Oracle impune existena a maxim o cheie principal pentru fiecare tabel. Cheia principal nu poate fi de tip long sau long raw. Nu putei desemna aceeai coloan sau combinaie de coloane att drept cheie principal ct i drept cheie unic sau att drept cheie principal ct i drept cheie de grup. Dac ncercai s facei acest lucru, programul Oracle genereaz o eroare. Exemplul urmtor adaug o cheie principal compus pe coloanele nume i prenume ale tabelului ANG: alter table ang add primary key (nume, prenume); alter table ang enable primary key; Restricia de integritate prin referin Restriciile de integritate prin referin sunt folosite pentru a impune regulile care dicteaz relaiile dintre coloanele diverselor tabele, 45
ntre tabele se creeaz o relaie printe-fiu. Tabelul printe conine cheia referit iar tabelul fiu conine cheia extern. De exemplu, s presupunem c avei un tabel printe care conine o list de 50 de state. Tabelul fiu poate fi un tabel de adrese care conine numele i adresa cunoscuilor dumneavoastr. Tabelul de adrese are o restricie prin referin care stabilete c singurele adrese valide sunt cele n care statul se regsete n tabelul printe de state. Dac ncercai s adugai o nou adres n care prescurtarea statului este ZZ, inserarea va eua, deoarece ZZ nu exist printre cele 50 de state ale tabelului printe. Exemplul urmtor creeaz aceast restricie de integritate prin referin asupra tabelului de adrese: alter table adrese add constraint fk abr stat foreign key (abr_stat) references abr_stat(abr_stat); Iat o list a principalilor termeni folosii la stabilirea unei restricii de integritate prin referin: Cheie extern - coloana sau setul de coloane incluse n definiia restriciei de integritate prin referin. Cheie referit - cheia unic sau cheia principal a aceluiai tabel sau a unui alt tabel la care face referire cheia extern. Tabel dependent - tabelul care conine cheia extern. Tabel referi - Tabelul care este referit de cheia extern. Sistemul Oracle impune cteva restricii n legtur cu manipularea cheilor prin referin. Nu putei s modificai sau s eliminai cheia referit dac cheia rezultant ar viola restriciile de integritate prin referin. De exemplu, nu putei elimina o valoare a cheii referite, deoarece acest lucru ar duce la violarea restriciilor prin referin. Totui, putei elimina valorile cheii referite dac nu exist nici o linie dependent. Eliminarea n cascad a cheilor externe Exist totui cazuri cnd este necesar s eliminai o valoare a cheii referite. Atunci cnd nu exist valori ale cheii externe care s fac referire la valoarea respectiv, putei elimina valoarea cheii referite. Dac ns, exista linii avnd asociat restricia foreign key ea va mpiedica s eliminai valoarea cheii referite. 46
Pentru a rezolva aceast problem, stabilii asupra cheii referite restricia on delete cascade. Restricia on delete cascade permite eliminarea din tabelul printe a oricror valori ale cheii referite care au linii dependente n tabelul fiu. Atunci cnd este eliminat o asemenea valoare n tabelul printe, programul Oracle elimin automat liniile corespunztoare din tabelul fiu. Restricia de integritate check Restricia de integritate check definete n mod explicit o condiie care trebuie s fie adevrat. Fiecare linie a tabelului trebuie s respecte condiia. Condiia poate fi evaluat i la valoarea Unknown pentru a permite prezena valorii null. Dac se ncearc executarea unei instruciuni care ar duce la nerespectarea condiiei, instruciunea este derulat napoi. Restricia check prezint urmtoarele limitri: Nu poate s conin subinterogri Nu poate s conin funciile sysdate, uid, user i userenv Nu poate utiliza pseudo-coloanele currval, nextval, level i rownum Exemplul urmtor creeaz o restricie check asupra coloanei ora din tabelul adresa_filiala: create table adresa_filiala (nr_filiala number(5), nume_filiala varchar2(50), oras varchar2(50) constraint verificare_oras check oras in ("chisinau","balti","tigina"), stat varchar2(50)); O singur coloan poate avea mai multe restricii check.
constraint_type - Tipul restriciei. Tipurile sunt C pentru check, P pentru cheie principal, U pentru cheie unic i R pentru cheie extern. table_name - Numele tabelului asociat cu definiia restriciei. search_condition - Textul condiiei de cutare pentru o condiie check. r_owner - Proprietarul tabelului la care se face referire ntr-o restricie prin referin. r_constraint_names - Numele restriciei de integritate primary key pentru coloana referit de o restricie prin referin. delete_rule - Modul de tratare a cheilor externe care fac referire la o cheie principal sau la o cheie unic eliminat. Cele dou opiuni sunt delete cascade i no action. Status - Valoare utilizat intern de serverul Oracle. Pentru a afia restriciile asociate unui anumit tabel, efectuai o operaiune select asupra tabelului USER_CONSTRAINTS pentru tabelul vizat. De exemplu, instruciunea urmtoare afieaz restriciile asociate tabelului LST_ARTICOLE: select constraint name "Nume" constraint_type "Tip" from user constraints where table name = 'lst_articole'; Date de ieire: Nume Tip S_COD_ARTICOLE_FK R S_NR_ARTICOLE_UK U S_ID_ARTICOLE_PK P Tabelul USER_CONS_COLUMN furnizeaz informaii suplimentare n legtur cu restriciile impuse unui tabel. n continuare sunt prezentate coloanele tabelului USER_CONS_COLUMN: Owner Utilizatorul care este proprietarul definiiei restriciei. constraint_name Numele definiiei restriciei. table_name Numele tabelului asociat cu definiia restriciei. column_name Numele coloanei specificate n definiia restriciei. Position Poziia iniial a coloanei n definiia restriciei. 48
Instruciunea urmtoare afieaz informaiile referitoare la restriciile impuse coloanelor tabelului client: select constraint_name "Restricie", colmnn_name "Coloana" from user_cons_coluinn where table_name = "client"; Date de ieire: Restrictie Coloana --------------S_CLIENT_ID_PK CLIENT_ID S_ZONA_VANZARI_CLIENT_FK ZONA_VANZARI
11
Ambalare
Riley
dba_cons_columns - Informaii n legtur cu toate coloanele care apar n definiiile restriciilor Distrugerea restriciilor de integritate Pentru a distruge o restricie de integritate, lansai comanda alter table cu clauza drop. n instruciunea urmtoare, este distrus restricia din tabelul lst articole: alter table lst_articole drop constraint s_cod_articole_fk;
Mersul lucrrii:
1. Distrugei eventualele tabele cu aceleai nume: drop table studenti; drop table dates; 2. Creai tabelul "studenti": create table studenti ( nr number(2) not null, nume char(7), prenume char(7), sex char(1) not null, oras char(8), adresa char(10), ani number(2) not null, grupa char(6), constraint studenti_primary_key primary key(nr)); Explicai fiecare operator din procedura de mai sus. 3. Introducei datele n tabelul "studenti":
insert into studenti values (00001,'Ricu','Slavic', 'M','chisinau','Studenti,21','AST961'); insert into studenti values (00002,'Odagiu','Silviu', 'M','chisinau','Studenti,22','AST951'); insert into studenti values (00004,'Mamulat','Rodica', 'F','Orhei','V_Lupu,23','C-962'); insert into studenti values (00005,'Bugaian','Vasile', 'M','Balti','Indepenta,23','TI-971'); insert into studenti values (00006,'Lupu','Maria', 'F','Ungheni','Florilor,20','AI-971');
51
5. Creai tabelul "dates": create table dates ( nr number(5) not null, nr_matr number(6) not null, an_inmatr number(4) not null, grupa char(6), nota_med number(4,2), bursa char(1), constraint studenti_foreign_key foreign key(nr) references studenti(nr)); 6. Introducei datele n tabelul "dates": insert into dates values (00001,961801,1996,'AST962',8.9,'y'); insert into dates values (00002,961352,1995,'AST951',9.0,'y'); insert into dates values (00004,971253,1971,'TI-972',8.0,'n'); insert into dates values (00005,971651,1971,'AI-972',8.9,'y'); 7. Vizualizai tabelul "dates": select * from dates; Rezultatul: NR NR_MATR AN_INMATR GRUPA NOTA_MED B --- --------- ------------ ------ ---------- 1 961801 1996 AST962 8.9 y 2 961352 1995 AST951 9 y 52
4 971253 1971 TI-972 5 971651 1971 AI-972 8. Introducei urmtorul rnd n tabelul "dates": insert into dates values (00006, 971651,1971,'AI-973',8.9,'y'); 9. Vizualizai din nou tabelul "dates": select * from dates;
8 n 8.9 y
Rezultatul: NR NR_MATR AN_INMATR GRUPA NOTA_MED --- --------- ------------ ------ ---------1 961801 1996 AST962 8.9 2 961352 1995 AST951 9 4 971253 1971 TI-972 8 5 971651 1971 AI-972 8.9 6 971651 1971 AI-973 8.9 10. Introducei nc un rnd n tabelul "dates": insert into dates values (00003,961352,1995,'AST952',9.0,'y');
B y y n y y
Rezultatul: ERROR at line 1: ORA-02291: integrity constraint (SCOTT.STUDENTI_FOREIGN_KEY) violated - parent key not found Explicai acest rezultat, comparai cu operaia din punctul 8. Introducei drop table studenti; drop table dates; Rezultatul: ERROR at line 1: ORA-02266: unique/primary keys in table referenced by enabled foreign keys drop table dates; Table dropped. Explicai acest rezultat Introducei din nou: 53
Rezumat
Integritatea datelor asigur respectarea de ctre baza de date a unui set predefinit de reguli stabilite de administratorul bazei de date i de programatorul aplicaiei. Att administratorul ct i programatorul preiau aceste reguli din zona de activitate a companiei pe care o susine baza de date. Practic, activitatea comercial este cu adevrat cea care impune i definete integritatea datelor. Integritatea datelor i restriciile de integritate sunt mecanismele folosite de serverul Oracle pentru a preveni introducerea datelor invalide n baza de date. Aceste restricii asupra datelor asigur respectarea cu strictee a regulilor companiei. n acest capitol, ai fcut cunotin cu diverse tipuri de restricii de integritate i ai nvat s le aplicai la nivel de tabel. De asemenea, au fost prezentate modurile de gestionare a restriciilor.
noilor date. Aceste aciuni sunt necesare pentru pstrarea intact a integritii i preciziei datelor. Baza de date ar fi inutil i nu i-ar justifica existena dac utilizatorii nu ar avea ncredere n datele acesteia. Selectarea datelor din baza de date reprezint aciunea de interogare a serverului i de obinere a unui rspuns la aceast interogare. Utilizatorii, proiectanii, administratorii bazei de date i alii au cu toii nevoie s selecteze date din baza de date. Utilizatorilor le este necesar accesul la date pentru efectuarea sarcinilor zilnice legate de activitile comerciale ale companiei. Proiectanii i administratorii bazei de date trebuie s poat accesa datele pentru a dezvolta noi aplicaii, pentru a valida aplicaii existente i pentru a acorda asisten utilizatorilor finali. Activitile curente ale unei companii necesit ntreinerea continu a datelor. De exemplu, o companie poate aduga noi comenzi n baza de date prin inserarea n server a unor linii noi coninnd comenzile. In plus, aceast companie poate s modifice cantitile din comenzile existente prin modificarea liniilor din server corespunztoare acestor comenzi. Acest capitol trateaz diversele metode de a accesa datele bazei de date cu comanda select. De asemenea, sunt descrise i comenzile folosite pentru ntreinerea datelor bazei de date.
Mersul lucrrii:
Afiarea coloanelor tabelelor
Pe parcursul acestui capitol, este esenial s tii exact ce tabele i coloane dorii s selectai sau s ntreinei. Comanda describe v poate ajuta s stabilii daca ntr-adevr accesai tabelul, vederea sau sinonimul dorit. Comanda describe afieaz structura tabelului, incluznd numele coloanelor, tipul, lungimea i precizia datelor i starea null sau not null a acestora. Creai tabelul Angajati, din Lucrarea de laborator Nr. 5, pentru aceasta putei utiliza fiierul-spuller al lucrrii precedente. Exemplul cu utilizarea comenzii describe pentru a afia structura tabelului a fost demonstrat n Lucrarea de laborator Nr. 5. n coloana Name din tabelul anterior sunt enumerate numele coloanelor. Acestea sunt numele la care facei referire n instruciunile dumneavoastr de selectare i de manipulare a datelor. Coloana Null? specific dac o coloan trebuie s conin date. O coloan trebuie s 55
conin datele numai dac n dreptul ei apare cuvntul cheie Not Null. n coloana Type apare tipul datelor din fiecare coloan a tabelului.
56
57
M M
Rezultatul: PRENUME --------Lucia Maria Maria christina Felix Ilie Ion Pavel
S ANI - --------F 38 F 35 F 35 F 35 M 25 M 35 M 32 M 42
Interogarea condiionat
Culegei: select NUME,PRENUME,ANI from angajati where ANI<35; Rezultatul: NUME PRENUME ANI --------- --------- --------Bucatru Felix 25 Vasilescu Ion 32
Manipularea datelor
Comenzile SQL insert, update i delete sunt folosite n instruciuni SQL pentru ntreinerea datelor din baza de date. NOT. Exemplele, care urmeaz mai jos, transformai-le n aa fel ca s poat fi valabile pentru tabelul utilizat, i probai-le practic.
Inserarea datelor
Comanda insert adaug o singur linie de date ntr-un tabel Oracle sau n tabelele de baz ale unei vederi. Datele care urmeaz s fie adugate n linia respectiv sunt specificate n clauza values a instruciunii insert. Exemplul urmtor folosete o instruciune insert simpl pentru a aduga o linie la tabelul ANG. Remarcai faptul c, pentru a genera automat numere secveniale unice pentru prima coloan, n instruciune se folosete generatorul de secven s_marca_ang. insert into ang values (s_marca_ang.nextval,'Ion','Petrescu', '23-B'); 59
Putei specifica anumite coloane n care vor fi introduse datele; coloanele nespecificate vor avea valoarea null. De exemplu, n tabelul lista_articole, n toate coloanele sunt inserate n mod explicit date cu excepia coloanei comentarii. Coloana comentarii rmne goal, cu alte cuvinte are valoarea null. insert into lista articole (cod_articol, nr_articol, nume_articol) values (s_cod_articol.nextval,'19832003",'Ventilator'); Comanda urmtoare folosete o subinterogare pentru generarea valorilor de intrare pentru instruciunea insert. Acest exemplu copiaz informaiile referitoare la angajai din tabelul uk_ang n tabelul ang: insert into ang select * from uk_ang where nume_regiune = 'UK';
Actualizarea datelor
Programul Oracle v permite s modificai valoarea datelor din orice coloan pe care o specificai. Instruciunea update este cea care efectueaz aceast sarcin. Aceast parte a capitolului descrie instruciunea update i diversele ei clauze. Exemplul urmtor actualizeaz toate liniile din tabelul VANZARI prin stabilirea unui comision de 0.25 pentru toi agenii de vnzri: update financiar.vanzari set comision = '.25'; Instruciunea urmtoare modific valoarea coloanei nr_dept pentru angajatul cu numar_marca egal cu 10923: update ang set nr_dept = '982-C' WHERE marca_ang = 10923; Putei de asemenea s efectuai mai multe actualizri simultan pe aceeai linie. De exemplu: update ang set nr_dept = '982-C', data_incepere = 'l-JUN1995' where marca_ang = 10923;
60
Exemplul urmtor actualizeaz mai multe linii ale unui tabel. n acest exemplu, numrul departamentului pentru toi angajaii departamentului Livrri va fi nlocuit cu 883: update ang set nr_dept = '883' where nume_dept = 'Livrari';
Eliminarea datelor
Pentru a elimina date dintr-un tabel sau din tabelele de baz ale unei vederi, folosii comanda SQL delete. Nu putei s eliminai linii dintr-o vedere dac interogarea de definire a vederii conine una dintre urmtoarele construcii: join operatorii set sau distinct clauza group by o funcie de grup Instruciunea urmtoare elimin toate liniile din tabelul CALIFICARE_1: delete from calificare_l; Pentru a elimina toate liniile dintr-un tabel, este recomandabil s folosii comanda SQL truncate. Aceasta este mai eficient dect comanda delete. Uneori dorii s eliminai numai anumite linii ale unui tabel. Pentru a face acest lucru, folosii comanda delete cu clauza where. De exemplu, instruciunea urmtoare elimin numai acele linii ale cror cantiti vndute sunt mai mici dect 100: delete from comenzi where cant_vanzari < 100;
Trunchierea tabelelor
Prin trunchierea unui tabel sunt eliminate toate liniile acestuia. Comanda truncate este mai rapid dect comanda delete din urmtoarele motive: truncate este o comand DDL si prin urmare nu genereaz informaii de revenire. Aceast comand trebuie folosit cu precauie deoarece ea nu poate fi derulat napoi. 61
Trunchierea unui tabel nu activeaz nici unul dintre declanatorii delete ai tabelului. Dac trunchiai un tabel principal al unui instantaneu, comanda truncate nu nregistreaz nici un fel de informaii n jurnalul de instantanee al tabelului. De asemenea, comanda truncate v permite s reinei spaiul eliberat spre a fi utilizat n continuare de tabelul respectiv. n mod prestabilit, sistemul Oracle returneaz serverului spaiul alocat eliberat.
Rezumat
Selectarea datelor din baza de date nseamn interogarea bazei de date i obinerea unor linii de date drept rspuns. ntreinerea datelor din baza de date implic actualizarea, inserarea i eliminarea datelor din baza de date pentru a asigura integritatea i caracterul complet al datelor. Unul dintre motivele fundamentale ale existenei bazelor de date este ca oamenii s le acceseze i s citeasc datele stocate n ele. Pentru satisfacerea cerinelor acestor utilizatori, datele trebuie pstrate actuale i precise. ntreinerea datelor este o condiie esenial a eficienei bazei de date. Afiarea structurii tabelelor este un aspect important al selectrii i ntreinerii tabelelor Oracle. Trebuie s cunoatei numele, tipul i lungimea datelor unei coloane pentru a reui s selectai i s ntreinei datele.
De exemplu, ele v permit s inserai noi linii ntr-un tabel sau ntr-o vedere. Instruciuni DDL (Data Definition Language - limbaj de definire a datelor), definesc sau modific structura obiectelor din schem. De exemplu, pentru crearea unui tabel, vei folosi instruciuni DDL. Instruciuni pentru controlul tranzaciilor, gestioneaz toate modificrile efectuate de instruciunile DML. De exemplu, instruciunile pentru controlul tranzaciilor salveaz datele. Instruciuni SQL ncapsulate, ncorporeaz instruciuni DML, DDL i instruciuni pentru controlul tranzaciilor ntr-un program scris ntr-un limbaj procedural. De exemplu, o instruciune SQL ncapsulat v permite s creai i s eliberai cursori. Instruciunea pentru controlul sistemului alter session este utilizat pentru a termina execuia proceselor i pentru a gestiona ali parametri de sistem. Instruciuni pentru controlul sesiunii, gestioneaz proprietile sesiunii unui utilizator. De exemplu, vei folosi instruciuni pentru controlul sesiunii pentru a activa i dezactiva roluri. SQL este un limbaj utilizat de: - administratorii bazei de date; - creatorii de aplicaii; - administratorii de securitate ai bazei de date; - utilizatorii finali. Limbajul SQL permite s dezvoltai programe performante, s lucrai cu grupuri mari de date, v scutete de efortul de a stabili metoda corect de acces, determin cele mai rapide i eficiente mijloace de accesare a datelor. n plus, SQL permite utilizarea rezultatelor unei interogri ca date de intrare pentru o alt instruciune de interogare, Limbajul SQL este folosit pentru a crea i a manipula toate obiectele Oracle. Aceste obiecte includ tabele, vederi, grupuri, instantanee, secvene, sinonime, roluri i spaii-tabel.
mici. Singura excepie o reprezint cazul n care se efectueaz o comparaie. Instruciunile SQL ncep cu comanda SQL, urmat de restul instruciunii. De exemplu, urmtoarea instruciune SQL folosete comanda SQL drop table pentru a elimina din baza de date obiectul-tabel ang: drop table ang; Atunci cnd serverul Oracle genereaz un cod de eroare, acesta are urmtoarea structur: error: cod_ eroare: descriere eroare Denumirea obiectelor Multe dintre obiectele Oracle sunt compuse din pri pe care trebuie s le denumii atunci cnd creai obiectul. De exemplu, coloanele tabelelor i secvenele sunt denumite n timp ce sunt create. Limbajul SQL impune o serie de reguli privind denumirea obiectelor. Regulile urmtoare sunt valabile pentru numele obiectelor, precum i cele ale utilizatorilor bazei de date: 1. Numele trebuie s aib ntre 1 i 30 de octei. Numele bazelor de date sunt limitate la opt octei; legturile bazelor de date pot avea pn la 128 de octei. 2. Numele nu pot fi ncadrate ntre ghilimele simple (apostrofe). 3. Nu se face distincie ntre majuscule i litere mici. 4. Numele pot conine numai caractere alfanumerice i caracterele _, $ i #. Numele legturilor bazelor de date pot conine i caracterele . i @. Numele trebuie s nceap cu un caracter alfabetic. 5. Un nume nu poate fi un cuvnt rezervat Oracle sau SQL. 6. Numele trebuie s fie unic n propriul spaiu al numelor. Toate obiectele enumerate ntr-un anumit aliniat sunt coninute n respectivul spaiu al numelor. Aceasta nseamn, de exemplu, ca un tabel i o vedere se gsesc n acelai spaiu al numelor drept pentru care nu pot avea nume identice. Spaiile-tabel se gsesc n alt spaiu al numelor dect indecii i prin urmare pot avea nume identice. Fiecare dintre urmtoarele aliniate reprezint un singur spaiu al numelor. Tabele, vederi, secvene, instantanee, pachete, sinonime private, proceduri de sine stttoare i funcii Indeci Restricii 65
Grupuri Declanatori Legturi private de baze de date Legturi publice de baze de date Spaii-tabel Segmente de revenire Sinonime publice Rolurile utilizatorilor 7. Un nume poate fi ncadrat ntre ghilimele duble. Iat cteva motive pentru folosirea ghilimelelor duble: Dac numele conine blancuri Dac vrei ca programul s fac deosebirea ntre majuscule i literele mici Dac vrei s ncepei numele cu orice altceva dect un caracter alfabetic Pentru a descrie acelai element, este bine s folosii acelai nume de coloan n toate tabelele. Referirea obiectelor Oracle Sintaxa general pentru referirea unui obiect sau a unei pri a unui obiect este: schema.nume_obiect.nume_parte_obiect @legatura_baza_de_date Schema este locul n care se gsete obiectul. Acest identificator v permite s facei referire la un obiect situat n baza de date a altui utilizator. Dac omitei acest identificator, Oracle consider c obiectul se gsete n schema dumneavoastr. nume_obiect este numele obiectului la care se face referire. nume_parte obiect v permite s facei referire la o parte a unui obiect, cum ar fi o coloan a unui tabel. Acest parametru este opional. legatura_baza_de_date este numele bazei de date care conine obiectul. Aceasta nu poate fi baza dumneavoastr de date - este baza de date a altui utilizator, pe care vrei s o accesai. Dac este omis acest parametru, programul Oracle presupune c facei referire la un obiect din propria dumneavoastr baz de date. ntr-o instruciune SQL care face referire la un obiect Oracle, programul evalueaz contextul instruciunii SQL i localizeaz obiectul n spaiul numelor corespunztor. Dac programul Oracle nu reuete s 66
gseasc obiectul n spaiul numelor corespunztor, returneaz o eroare. Programul Oracle ncearc ntotdeauna s localizeze obiectul n schema dumneavoastr nainte de a lua n considerare spaiile numelor din afara schemei dumneavoastr. Dac obiectul nu se gsete n schema dumneavoastr, programul Oracle caut n spaiul numelor care conine sinonimele publice. Dac obiectul nu este gsit, Oracle returneaz un mesaj de eroare. Analiza instruciunilor SQL Atunci cnd o aplicaie lanseaz o instruciune SQL, reprezentarea analizat sintactic a instruciunii SQL este ncrcat n zona SQL partajat din server. Analiza presupune efectuarea urmtoarelor operaii: - verificarea corectitudinii sintactice i semantice a instruciunilor SQL; - stabilirea faptului dac procesul care a lansat instruciunea SQL posed privilegiile necesare pentru executarea ei; - consultarea dicionarului de date n vederea analizrii definiiilor tabelului i ale coloanelor; - instituirea de blocaje asupra obiectelor necesare astfel, nct definiiile acestora s nu se modifice n timpul execuiei; - determinarea planului optim de execuie care urmeaz s fie utilizat n momentul executrii instruciunii. Analiza are loc numai dac nu exist nici o alt instruciune SQL identic n zona SQL partajat. Dac n aceast zon exist deja o copie, sistemul Oracle folosete copia din memorie n loc s analizeze copia codului surs, pe care ncercai s o executai. n cazul n care nu exist nici o copie, sistemul Oracle trece la analiza instruciunii. Analiza instruciunii are loc o singur dat, indiferent de cte ori este executat instruciunea. Programul Oracle re-execut instruciunea analizat la fiecare referire ulterioar a instruciunii respective. Validarea sintactic i semantic efectuat n timpul analizei detecteaz numai erorile care pot fi gsite naintea execuiei instruciunii. Exist ns erori pe care analiza nu le poate detecta. De exemplu, erorile legate de conversia datelor nu pot fi depistate nainte de execuia instruciunii. Procesarea interogrilor Procesarea interogrilor este puin diferit de a altor tipuri de instruciuni SQL, deoarece interogrile returneaz date sub form de 67
rezultate daca execuia instruciunii s-a ncheiat cu succes. Instruciunile non-interogative returneaz fie succesul" fie eecul", ns o interogare returneaz linii multiple de date. Aceste date sunt prezentate utilizatorului n format tabelar. Interogrile pot deveni interogri implicite n anumite instruciuni SQL. De exemplu, fiecare dintre instruciunile urmtoare necesit o interogare ca parte a execuiei: - update - delete from - create table as Execuia instruciunilor SQL Lista urmtoare specific fazele execuiei unei instruciuni SQL: 1. Este creat automat un cursor n ateptarea execuiei instruciunii SQL. 2. Programul Oracle analizeaz instruciunea SQL. 3. n cazul n care rezultatele unei interogri nu sunt cunoscute, programul Oracle determin caracteristicile (tipul datelor i lungimea) datelor rezultatului. 4. Programul Oracle definete domeniile datelor de ieire. Acestea includ locaia, dimensiunea i tipul de date ale variabilelor care urmeaz s primeasc fiecare dintre valorile preluate. 5. Programul Oracle efectueaz legarea tuturor variabilelor, cu alte cuvinte, definete valoarea fiecrei variabile. De exemplu, programul Oracle stabilete valoarea ang_nume n timpul procesului de legare. 6. n sfrit, programul Oracle execut instruciunea SQL. 7. Liniile de date sunt selectate (i ordonate dac este necesar) i fiecare preluare succesiv citete o nou linie a rezultatului pn n momentul citirii tuturor liniilor. SQL i SQL*Plus SQL este limbajul folosit pentru comunicarea cu baza de date relaionale. SQL*Plus este un instrument al serverului Oracle care recunoate i execut instruciuni SQL. SQL*Plus nu este o extensie sau un superset al limbajului SQL. Unul dintre avantajele SQL*Plus este c putei s editai sau s salvai comenzi SQL care se gsesc n tamponul SQL. Tamponul SQL este o poriune a memoriei gestionate de SQL*Plus care stocheaz o singur comand SQL la un moment dat. Aceast 68
comand SQL rmne n tamponul SQL pn cnd este lansat o nou comand. Procesarea vectorial a comenzilor SQL Ori de cte ori aplicaia dumneavoastr transmite o instruciune serverului Oracle, aplicaia efectueaz un apel de funcie. Procesarea vectorial permite aplicaiei dumneavoastr s execute o singur instruciune SQL de mai multe ori cu o singur apelare a programului Oracle. De exemplu, folosind procesarea vectorial, aplicaia dumneavoastr poate efectua un singur apel pentru a executa o instruciune SQL de 50 de ori. Prin reducerea numrului de apelri ale programului Oracle, se reduc procesrile suplimentare i cresc performanele serverului. Instrumentele Oracle cum sunt SQL*Forms, SQL*Plus i SQL*Loader utilizeaz automat procesarea vectorial. Partajarea instruciunilor SQL Programul Oracle detecteaz mai multe aplicaii care transmit serverului instruciuni SQL identice. Atunci cnd programul recepioneaz o instruciune SQL duplicat, el nu analizeaz aceast a doua instruciune SQL. Programul consult zona SQL partajat pentru a detecta instruciuni identice. Aceste instruciuni pot proveni de la aplicaii, de la utilizatorii interactivi sau chiar de la instruciuni SQL recursive. Atunci cnd sunt detectate instruciunile SQL duplicate, prima apariie a instruciunii respective este utilizat n comun de toate celelalte procese care au nevoie de ea. Utilizarea zonei SQL partajate reduce gradul de utilizare a memoriei serverului bazei de date, ducnd la mbuntirea performanelor.
Funciile SQL
Ce sunt funciile?
Funciile sunt operaii predefinite care manipuleaz date i returneaz un rezultat. Funciile pot genera dou tipuri de date de ieire. Primul tip - datele de intrare dup manipularea acestora, iar la doilea furnizeaz informaii n legtur cu datele de intrare. De exemplu, o funcie poate converti la majuscule toate caracterele irului de intrare; alt funcie poate returna numrul de caractere din irul de intrare. 69
Exist dou tipuri de funcie: Funcii mono-linie; Funcii multi-linie sau de grup. Deosebirea dintre aceste dou tipuri de funcii este dat de numrul de linii asupra crora acioneaz. Funciile sunt asemntoare operatorilor, cu excepia faptului c primele pot aciona asupra unor argumente multiple. Sintaxa general a funciilor este urmtoarea: funcie (argument1, argument2, ...) n continuare sunt prezentate cele dou categorii: funcii mono-linie i funcii de grup.
Mersul lucrrii:
Verificai funciile de mai jos n timpul efecturii lucrrii. Repetai toate exemplele de mai jos. ASCII Returneaz echivalentul zecimal al unui caracter ASCII Sintax: acii(char) Culegei: select ascii('B') from dual; Rezultatul: ascii('B') ---------66 CHR Returneaz caracterul ASCII corespunztor valorii ntregi furnizate ca argument. De exemplu, echivalentul ASCII al literei K este 75. Sintax: CHR(integer) Culegei: select chr(75) from dual; Rezultatul: C K LENGTH Returneaz numrul de caractere (lungimea) al irului de intrare. Sintax: length(char) Culegei: select length('ABcDEFGHIJ') from dual; Rezultatul: LENGTH('ABCDEFGHIJ') -------------------70
10 LOWER Returneaz irul de intrare dup trecerea tuturor caracterelor la litere mici. Sintax: lower(char) Culegei: select lower('NISPORENI') from dual; Rezultatul: LOWER('NI --------nisporeni LPAD Returneaz irul de intrare n stnga cruia este adugat secvena de caractere din cel de-al treilea argument. Aceast funcie are trei argumente: primul este irul de intrare; al doilea este lungimea maxim a valorii returnate; iar al treilea este secvena de caractere care va fi adugat. Sintax: lpad(sir de intrare, lungime, secventa de completare) Culegei: select lpad('AVERTISMENT: ',20,'***** ') from dual; Rezultatul: LPAD('AVERTISMENT:', -------------------***** *AVERTISMENT: REPLACE Returneaz irul de intrare n care fiecare apariie a irului de cutare este nlocuit cu irul de nlocuire. Sintax: replace(sir intrare,sir cautare,sir inlocuire) Culegei: select replace(Pete','Pe','123') from dual; Rezultatul: REPLA ----123te UPPER Returneaz irul de intrare dup trecerea tuturor caracterelor la majuscule. Sintax: upper(char) 71
Funcii numerice
Funciile numerice primesc date de intrare numerice i returneaz o valoare numeric. ABS Returneaz valoarea absolut a valorii de intrare. Sintax: abs(n) Culegei: select abs(3) from dual; Rezultatul: ABS(3) ----3 POWER Returneaz valoarea de intrare ridicat la puterea n. Sintax: power(valoare,n) Culegei: select power(4,2) from dual; Rezultatul: POWER(4,2) ---------16 ROUND Rotunjete valoarea de intrare la numrul specificat de poziii zecimale. Sintax: round(valoare intrare,precizie) Culegei: select round(123.456,2) from dual; Rezultatul: ROUND(12'3.456,2) ----------------123.46 TRUNC Trunchiaz valoarea de intrare la numrul specificat de poziii zecimale. Sintax: trunc(valoare intrare,precizie) 72
Funcii de conversie
Funciile de conversie transform valorile de intrare dintr-un tip de dat n altul. TO_CHAR Convertete o dat sau un numr ntr-un ir de caractere. Sintax: to_char(intrare,format) Culegei: select to_char(SYSDATE,'mm/dd/yy') from dual; Rezultatul: TO_CHAR(SYSDATE,'MM/DD/YY') ----------------------------02/23/01 TO_DATE Convertete o valoare numeric sau de tip caracter la tipul date. Sintax: to_date(sir,format) Culegei: select to_date('04/21/99','MM/DD/YY') from dual; Rezultatul: TO_DATE(' --------21-APR-99 TO_NUMBER Convertete un ir de caractere ntr-un format numeric. Sintax: to_number(sir caractere,format) Culegei: select to_number ('1234.56') FROM DUAL; Rezultatul: TO_NUMBER('1234.56') -------------------1234.56
74
Funcii de grup
Funciile de grup returneaz o singur valoare pentru un grup de linii interogate. AVG Returneaz valoarea medie pentru un grup de linii. Sintax: avg(valoare) Culegei: select avg (ani) from angajati; 75
Rezultatul: AVG(ANI) --------34.625 COUNT Returneaz numrul de linii dintr-o interogare. n funcia count, putei utiliza urmtorii specificatori: Sintax: count Culegei: select count (*)from angajati; Rezultatul: COUNT(*) --------8 MAX Returneaz valoarea maxim a expresiei. Sintax: max(expresie) Culegei: select max (ani) from angajati; Rezultatul: MAX(ANI) --------42 MIN Returneaz valoarea minim a expresiei. Sintax: min(expresie) Culegei: select min (ani) from angajati; Rezultatul: MIN(ANI) --------25 SUM Returneaz suma valorilor expresiei. Sintax: sum(expresie) Culegei: select sum (ani) from angajati; Rezultatul: SUM(ANI) --------277
76
Rezumat
SQL este singurul limbaj de comunicare cu baza de date Oracle. Acest limbaj posed propria structur i sintax. Limbajul SQL permite s lucrai cu obiectele de nivel nalt ale schemei n locul liniilor individuale. In plus, el limiteaz magistralele prin intermediul crora putei interaciona cu serverul, mbuntind astfel securitatea serverului i reducnd riscul compromiterii datelor. Putei comunica interactiv cu baza de date Oracle prin folosirea limbajului SQL. n plus, chiar aplicaiile dumneavoastr utilizeaz limbajul SQL pentru a accesa baza de date. Folosirea limbajului SQL este simpl; exist doar cteva reguli care trebuie respectate la crearea instruciunilor SQL, lucru care sporete flexibilitatea i puterea acestor instruciuni. Funciile sunt rutine predefinite care manipuleaz date i returneaz o valoare. Funciile returneaz o valoare care fie descrie datele de intrare, fie reprezint rezultatul manipulrii datelor de intrare. Funciile mono-linie returneaz un rezultat pentru fiecare linie a unei interogri, n timp ce funciile de grup returneaz un singur rezultat pentru un grup de linii ale unei interogri.
date din tabele multiple care sunt nrudite ntre ele. Aceast caracteristic simplific procesul de interogare.
Reuniuni simple
O reuniune simpl (simple join) este o instruciune select care returneaz linii din dou sau mai multe tabele. Aceste tabele se afl n relaie, sau sunt reunite, pe baza coloanelor pe care le au n comun. Tabelele care sunt reunite pe baza coloanelor comune apar n clauza from a instruciunii select. n acest capitol, este tratat reuniunea a dou tabele, ns aceste informaii sunt aplicabile i reuniunii a trei sau mai multe tabele. Oracle nu impune nici o limitate n legtur cu coloanele pe care le putei selecta din fiecare tabel. Putei s nu selectai nici o coloan sau s selectai coloane multiple din fiecare tabel. Coloanele pe care le specificai n clauza where nu este necesar s apar n lista select. Reunirea a dou tabele fr clauza where creeaz un produs cartezian. Acest produs combin fiecare linie a primului tabel cu fiecare linie a celui de-al doilea tabel. De exemplu, produsul cartezian al unui tabel cu 10 linii cu un alt tabel cu 25 de linii reprezint o reuniune cu 250 de linii. De obicei acest rezultat nu are nici un sens i nu este folosit aproape deloc. Putei substitui numele real al tabelului cu aliasul acestuia n clauza from a instruciunii select. In acest caz ns, mediul Oracle impune substituirea numelui tabelului cu aliasul pe tot parcursul instruciunii select, att n lista select, ct i n clauza where.
Mersul lucrrii:
Pentru a putea urmri procesul reuniunilor, pe lng tabelul creat mai nainte Angajati mai crem tabelul contabilitate: /* crearea tablului contabilitate */ drop table contabilitate; create table contabilitate ( nas char(9) not null, nr_postului varchar2(6) not null, categorie NUMBER(1), salariu NUMBER(7) ); /* Inserarea datelor in tabelul contabilitate */ 78
insert into contabilitate values ('199073432', 'ps272', 2, 235); insert into contabilitate values ('198029823', 'ps275', 3, 142); insert into contabilitate values ('199549525', 'ps71', 1, 225); insert into contabilitate values ('199579013', 'ps175', 4, 335); insert into contabilitate values ('199571002', 'ps75', 5, 535); insert into contabilitate values ('199487815', 'ps410', 1, 138); insert into contabilitate values ('199665972', 'ps235', 2, 232); insert into contabilitate values ('199623961', 'ps410', 3, 335); /* */ select * from contabilitate; Rezultatul: NAS NR_POS CATEGORIE SALARIU --------- ------ --------- --------199073432 ps272 2 235 198029823 ps275 3 142 199549525 ps71 1 225 199579013 ps175 4 335 199571002 ps75 5 535 199487815 ps410 1 138 199665972 ps235 2 232 199623961 ps410 3 335 8 rows selected. Tabelul creat mai nainte Angajati: select * from Angajati;
NAS --------199073432 198029823 199549525 199579013 199571002 199487815 NUME --------Rusu Dionis Bucatru Gurau Ionescu Dusca PRENUME --------Maria Pavel Felix christina Ilie Lucia S ANI ANGAJAT NR_ NR_POS - --- --------- --- -----F 35 20-OCT-95 u12 ps272 M 42 17-NOV-98 u12 ps275 M 25 08-JAN-95 u14 ps71 F 35 27-JAN-94 u12 ps175 M 35 19-SEP-95 u14 ps75 F 38 12-MAR-95 u18 ps410
79
M F
Sintaxa unei reuniuni simple este urmtoarea: select coloana(e) from tabel1, tabel2 where tabel1.coloana1 = tabel2.coloana1 unde: coloana(e) reprezint coloana sau coloanele din care se citesc datele tabel1, tabel2 reprezint tabelele din care se citesc datele tabel1.coloana1 = tabel2.coloana1 reprezint condiia care reunete cele dou tabele. Aceast instruciune creeaz o reuniune pentru tabelele Angajati i contabilitate: select Angajati.nume, Angajati.prenume, contabilitate.SALARIU from Angajati, contabilitate where Angajati.NAS = contabilitate.NAS; Rezultatul: NUME PRENUME SALARIU --------- --------- --------Dionis Pavel 142 Rusu Maria 235 Dusca Lucia 138 Bucatru Felix 225 Ionescu Ilie 535 Gurau christina 335 Scutaru Maria 335 Vasilescu Ion 232 8 rows selected. Pentru a returna anumite linii dintr-o reuniune, pur i simplu introducei n clauza where, pe lng condiia de reunire, o condiie de cutare: select Angajati.nume, Angajati.prenume, contabilitate.SALARIU from Angajati, contabilitate where Angajati.NAS = contabilitate.NAS and Angajati.nume like 'B%'; 80
Reuniuni externe
O reuniune extern (outer join) este asemntoare cu o reuniune simpl. O reuniune extern returneaz toate liniile pe care le returneaz reuniunea simpl, precum i toate liniile ale cror valori din coloanele dup care se face reuniunea apar ntr-un tabel i nu se regsesc n coloanele corespunztoare ale nici unei linii din cellalt tabel. Sintaxa reuniunii externe este select coloana(e) from tabel1, tabel2 where tabel1.coloana1 = tabel2.coloana(+) unde: - (+) este folosit pentru a indica o reuniune extern; - coloana(e) reprezint coloana sau coloanele din care se citesc datele; - tabel1, tabel2 reprezint tabelele din care se citesc datele; - tabel1.coloana1 = tabel2 .coloana2 reprezint condiia care reunete cele dou tabele. Semnul plus (+) poate fi plasat n oricare parte a condiiei din clauza where, ns nu n ambele pri. Simbolul reuniunii externe trebuie plasat n dreapta numelui tabelului n care nu apar linii care se gsesc n cellalt tabel. Programul Oracle genereaz nuluri pentru coloanele acestui tabel ori de cte ori tabelul nu are nici o linie care s poat fi reunit cu o linie din cellalt tabel. Pentru a ilustra reuniunea extern crem tabelul departament, n care sunt afiate toate posturile, inclusiv i cele vacante. /* crearea tablei departament */ drop table departament; create table departament ( nas char(9) not null, nr_postului varchar2(6) not null );
/* insert insert insert Inserarea datelor in tabelul contabilitate */ into departament values ('199073432', 'ps272'); into departament values ('198029823', 'ps275'); into departament values ('199549525', 'ps71');
81
Aspectul tablei departament Select * from departament; Rezultatul: NAS NR_POS --------- -----199073432 ps272 198029823 ps275 199549525 ps71 199579013 ps175 199571002 ps75 199487815 ps410 199665972 ps235 199623961 ps410 199623962 ps410 199623963 ps410 199623964 ps410 11 rows selected. Instruciunea urmtoare creeaz o reuniune extern a tabelelor Angajati i departament. Remarcai faptul c simbolul reuniunii externe este plasat n dreptul tabelului Angajati, deoarece acestuia i lipsesc cteva linii care se gsesc n tabelul departament. Remarcai, de asemenea, faptul c sunt afiate toate liniile din tabelul departament. select Angajati.nume, Angajati.prenume, departament.nr_postului from Angajati, departament where Angajati.NAS(+) = departament.NAS; Rezultatul: NUME PRENUME NR_POS --------- --------- -----82
ps275 ps272 ps410 ps71 ps75 ps175 ps410 ps410 ps410 ps410 ps235
Reuniuni i vederi
Putei folosi o reuniune pentru a simplifica crearea unei vederi. De exemplu, putei folosi o reuniune pentru a defini o vedere care este o colecie de coloane sau linii (din tabele multiple) aflate n relaie. Vederea ascunde faptul c aceste informaii provin din tabele multiple.
Reuniuni i grupuri
n serverul Oracle, este recomandabil s grupai numai acele tabele care sunt reunite frecvent n instruciuni SQL pe baza coloanelor cheie ale grupului. Gruparea determin mbuntirea performanelor reuniunilor ns va duce cu siguran la scderea performanelor parcurgerii integrale a tabelelor, operaiunilor de inserare n tabele i a instruciunilor update care modific valori ale cheii grupului. nainte de a grupa coloanele reunite, cntrii avantajele i dezavantajele, ntruct aceast reuniune afecteaz performanele serverului.
union
union este un operator care combin rezultatele a dou interogri ntr-un singur rezultat. Acest operator returneaz numai valorile distincte rezultate din interogare. Creai dou tabele simple articole_1 i articole_2: create table articole_1( articol varchar2(15) ); 83
insert into articole_1 values insert into articole_1 values insert into articole_1 values insert into articole_1 values create table articole_2( articol varchar2(15) ); insert into articole_2 values insert into articole_2 values insert into articole_2 values insert into articole_2 values insert into articole_2 values insert into articole_2 values
Culegei: select articol articol1 from articole_1; Rezultatul: articol1 -----------bobina condensator dioda comutator Culegei: select articol articol2 from articole_2; Rezultatul: articol2 --------------bobina motor tranzistor cablu rezistor cablu 6 rows selected. Instruciunea urmtoare efectueaz o uniune a celor dou liste: select articol from articole_1 84
union select articol from articole_2; Rezultatul: ARTICOL --------------bobina cablu comutator condensator dioda motor rezistor tranzistor 8 rows selected. Dup cum se poate vedea din exemplul precedent, toate valorile distincte din ambele tabele sunt incluse n rezultatele interogrii. Atunci cnd operatorii union i union all sunt folosii n instruciuni care selecteaz date de tip caracter, tipul valorilor returnate este dup cum urmeaz: - dac ambele interogri selecteaz valori de tip char, valorile returnate vor fi de tip char. - dac cel puin una dintre interogri selecteaz valori de tip varchar2, valorile returnate vor fi de tip varchar2.
union all
Operatorul union all combin rezultatele a dou interogri ntrun singur rezultat. Acest operator returneaz toate valorile furnizate de interogri. select articol from articole_1 union all select articol from articole_2; Rezultatul: ARTICOL --------------bobina condensator dioda comutator bobina 85
motor tranzistor cablu rezistor cablu 10 rows selected. Dup cum se poate vedea din exemplul precedent, toate valorile din ambele tabele sunt incluse n rezultatele interogrii, inclusiv liniile de date duplicate.
order by
Putei folosi clauza order by n instruciunea select a unei interogri union. Pentru a face acest lucru, trebuie s specificai n instruciunea union numrul coloanei (nu numele acesteia) dup care dorii s fie ordonate datele. Instruciunea urmtoare folosete clauza order by pentru a sorta rezultatele n ordinea ascendent a coloanei articol, care este prima (n cazul dat unica). Culegei: select articol from articole_1 union select articol from articole_2 order by 1; Rezultatul: ARTICOL --------------bobina cablu comutator condensator dioda motor rezistor tranzistor 8 rows selected.
intersect
Operatorul intersect combin dou instruciuni select i returneaz numai acele linii, care sunt returnate de ambele interogri. Instruciunea urmtoare efectueaz o intersecie a celor dou liste: 86
select articol from articole_1 intersect select articol from articole_2; Rezultatul: ARTICOL --------bobina Acest operator returneaz numai acele articole care exist n ambele liste.
minus
Operatorul minus combin rezultatele a dou interogri i returneaz numai acele valori care sunt selectate de prima interogare dar nu i de a doua. Folosind aceleai liste din exemplul anterior, fie urmtoarea instruciune: select articol from articole_1 minus select articol from articole_2; Rezultatul: ARTICOL -------------comutator condensator dioda n acest exemplu, instruciunea returneaz numai acele linii care se gsesc n prima list, dar nu i n a doua.
Rezumat
n aceast lucrare, ai aflat c reuniunea i uniunea sunt dou metode de grupare logic a datelor din tabele distincte. Odat grupate, putei s afiai grupul rezultant sau s-1 prelucrai n continuare. Reuniunea i uniunea se folosesc pentru a grupa date din tabele multiple n vederea afirii lor pe ecran sau n vederea prelucrrii lor n continuare. Aceste tehnici v permit s interogai tabele multiple care se afl ntr-o relaie dat de una sau mai multe coloane comune, pentru a crea un singur set de rezultate. Reuniunea i uniunea folosesc instruciunea select pentru a interoga baze de date multiple. Prin utilizarea diverselor tipuri de reuniuni i uniuni, putei controla domeniul de valori returnate de instruciunea select. 87
De exemplu, ca i n cazul tabelelor, putei avea pn la 255 de coloane ntr-o vedere. Vederile pot fi interogate, actualizate i se pot efectua inserri n ele. Toate operaiile efectuate asupra unei vederi afecteaz practic tabelele de baz ale vederii. In plus, vederile sunt supuse restriciilor de integritate i declanatorilor asociate tabelelor de baz.
Crearea vederilor
Pentru a crea o vedere, folosii comanda SQL create view. Putei defini o vedere cu orice interogare care face referire la tabele, instantanee sau alte vederi. Definiia unei vederi este stocat n dicionarul de date.
Mersul lucrrii:
Exemplul urmtor creeaz o vedere simpl, numit ang_vedere: create view ang_vedere AS select nas, nume, prenume, sexe FROM Angajati WHERE sexe = M; Rezultatul: View created. Vederea poate fi afiat cu ajutorul comenzilor asemntoare cu acele pentru tabele, de exemplu; Select * from ang_vedere; Rezultatul: NAS NUME PRENUME S --------- --------- --------- 198029823 Dionis Pavel M 199549525 Bucatru Felix M 199571002 Ionescu Ilie M 199665972 Vasilescu Ion M Vederea ang_vedere va face referire numai la acele linii pentru care sexe este M. Codul urmtor creeaz o vedere mai complex care reunete date din mai multe (dou) tabele. Concret, reprezint borderoul de pli al salariului remis casei i bazat pe tabelul Angajati, aflat la secia cadre i tabelul contabilitate aflat n contabilitate. Concomitent este fcut suma total, livrat casei pentru salariu. 89
create view casa as select Angajati.nume, Angajati.prenume, contabilitate.salariu from Angajati, contabilitate Where Angajati.NAS = contabilitate.NAS; Select * from casa; select sum (salariu) from casa; Rezultatul: View created. SQL> Select * from casa; NUME PRENUME SALARIU --------- --------- --------Dionis Pavel 142 Rusu Maria 235 Dusca Lucia 138 Bucatru Felix 225 Ionescu Ilie 535 Gurau christina 335 Scutaru Maria 335 Vasilescu Ion 232 8 rows selected. SQL> select sum (salariu) from casa; SUM(SALARIU) -----------2177 Studiai de sine stttor materialul care urmeaz i ncercai s implementai exemplele utilizate mai jos n schema dumneavoastr Comanda create view face obiectul urmtoarelor limitri: with check option nu este specificat n acest exemplu deoarece ntr-o vedere definit printr-o interogare care conine o reuniune nu pot fi inserate sau actualizate linii. Nu pot fi utilizate clauzele order by sau for update. Atunci cnd este creat o vedere cu o interogare care utilizeaz caracterul de nlocuire (*), programul Oracle expandeaz interogarea nlocuind caracterul (*) cu numele reale ale coloanelor atunci cnd stocheaz vederea n dicionarul de date. De exemplu, urmtoarea interogare va crea o vedere ang: 90
CREATE VIEW ang AS SELECT * FROM comp.ang; Oracle stocheaz n dicionarul de date interogarea de definire a vederii n forma urmtoare: CREATE VIEW ang AS SELECT "marca_ang", "prenume", "nume", "nr_dept" FROM comp.ang; Numele coloanelor au fost ncadrate ntre ghilimele, deoarece exist posibilitatea ca numele coloanelor obiectului de baz s fie introduse iniial cu ghilimele. Oracle v permite s creai o vedere a unor tabele chiar dac tabelele nu exist. Instruciunea create view force va obliga programul s creeze vederea chiar dac tabelele nu exist sau dac utilizatorul nu posed privilegiile corespunztoare n legtur cu tabelele respective. Dei programul va crea vederea chiar i n aceste situaii, utilizatorul nu va putea s o foloseasc. Vederea va deveni valid i accesibil utilizatorilor numai dup crearea tabelelor de baz, acordarea privilegiilor corespunztoare i recompilarea vederii. Instruciunea create view noforce va crea vederea numai dac tabelele de baz exist i utilizatorul posed privilegiile corespunztoare n legtur cu aceste tabele.
nlocuirea vederilor
Pentru a modifica definiia unei vederi, vederea trebuie nlocuit. Vederile pot fi nlocuite n dou moduri: Vederea poate fi distrus i apoi re-creat cu noua definiie. Atunci cnd vederea este distrus, toate privilegiile sunt retrase. Aceste privilegii trebuie s fie recreate pentru noua vedere. Vederea poate fi re-creat prin redefinirea ei cu instruciunea create view cu clauza opional or replace. Aceast metod este folosit pentru nlocuirea definiiei curente a unei vederi cu conservarea tuturor privilegiilor curente. Exemplul urmtor nlocuiete vederea ang_dept_nume cu noua definiie a vederii: CREATE or replace view ang_dept_nume as SELECT prenume, nume, marca_ang, dept.nr_dept FROM ang, dept WHERE ang.nr_dept = 15; nlocuirea vederilor are urmtoarele efecte: Definiia vederii din dicionarul de date este actualizat. Nici unul dintre obiectele de baz nu este afectat de nlocuirea vederii. Toate restriciile care existau n vederea original ns nu se regsesc n noua vedere, sunt distruse. Toate vederile i programele PL/SQL dependente de vederea nlocuit devin invalide. Pentru a nlocui o vedere, trebuie s posedai privilegiile de sistem necesare pentru distrugerea i crearea unei vederi.
Utilizarea vederilor
Vederile trebuie s fie tratate similar tabelelor n instruciunile SQL. De exemplu, instruciunea urmtoare interogheaz vederea ang_dept_nume: select prenume, nume, marca_ang from ang_dept_nume; Urmtorul exemplu insereaz o nou nregistrare n tabelul ANG utiliznd vederea ang_dept_nume: insert into ang_dept_nume values ('Thomas','Baker',281); 92
Putei folosi o vedere oriunde ai folosi un tabel n oricare dintre urmtoarele instruciuni SQL: select insert update comment lock table Utilizarea vederilor face obiectul urmtoarelor limitri: Nu putei folosi o vedere pentru a efectua operaii insert, update sau delete atunci, cnd interogarea vederii conine o operaie join, operatorii set sau distinct, o clauz group by sau o funcie group. Nu putei utiliza o vedere definit cu clauza with check option pentru a insera sau a actualiza tabelele de baz. Nu pot fi inserate linii n tabelul de baz, dac o coloan not null a liniei respective este definit fr clauza default value. Nu pot fi inserate linii n tabele utiliznd o vedere care a fost creat folosind expresia decode. Interogarea unei vederi nu poate s fac referire la pseudo-coloanele nextval sau currval. Dezavantajul utilizrii unei vederi este c aceasta adaug unul sau mai multe nivele de procesare atunci, cnd un utilizator interogheaz sau manipuleaz datele prin intermediul vederii. Utilizarea vederilor necesit un timp suplimentar de procesare nainte ca datele s fie citite, reducnd puin viteza de rspuns a serverului Oracle.
Recompilarea vederilor
Pentru a recompila n mod explicit o vedere, folosii comanda alter view nume_vedere compile. Recompilarea permite detectarea eventualelor erori referitoare la vederea respectiv naintea executrii vederii n mediul real al companiei. Este recomandabil s recompilai n mod explicit vederea dup orice modificare a oricruia dintre tabelele de baza ale vederii. Instruciunea urmtoare va recompila vederea ang_dept_nume: ALTER VIEW ang_dept_nume COMPILE; 93
Comanda alter view nu modific definiia vederii sau orice alt obiect care ar putea s depind de ea. Putei s recompilai orice vedere din schema dumneavoastr; pentru a recompila o vedere din alt schem, trebuie s posedai privilegiul de sistem alter any table.
Distrugerea vederilor
Pentru a distruge o vedere, utilizai comanda drop view. Exemplul urmtor distruge vederea ang_dept_nume: drop view ang_dept_nume; Putei s distrugei orice vedere din schema dumneavoastr. Pentru a distruge o vedere din schema altui utilizator, trebuie s posedai privilegiul de sistem drop any view.
Rezumat
O vedere este un tabel logic care v permite s accesai datele din alte tabele i vederi. Vederile nu conin date. Tabelele pe care se bazeaz vederea sunt cele care conin datele i sunt cunoscute sub numele de tabele de baz. Vederile permit creatorului aplicaiei s prezinte utilizatorului informaii ntr-o form diferit de cea a tabelelor de baz, dar care satisface cerinele utilizatorului cu privire la date. De asemenea, vederile mbuntesc securitatea bazei de date prin mascarea adevratelor nume i locaii ale tabelelor de baz. Accesarea i manipularea datelor prin intermediul unei vederi este asemntoare lucrului cu tabele. Putei executa instruciuni select, insert, delete i update cu vederi n acelai fel n care ai face-o cu tabele, atta timp ct vederea face referire la un singur tabel.
fiecare utilizator. n linii mari, exist trei tipuri de utilizatori, care necesit trei nivele de acces diferite la baza de date. Aceti utilizatori sunt administratorii bazei de date, creatorii de aplicaii i utilizatorii finali. Fiecare baz de date Oracle posed o list a utilizatorilor valizi. Acetia sunt utilizatorii care se pot conecta la baza de date. Fiecare utilizator are un set de privilegii care definesc tipul utilizatorului respectiv. Un privilegiu reprezint autoritatea de a accesa un obiect al bazei de date ntr-o manier predefinit. De exemplu, un utilizator final poate avea privilegiile necesare pentru a selecta date din unele dintre tabelele bazei de date, dar s-i fie interzis s creeze sau s distrug obiecte ale bazei de date. Organizaia trebuie s stabileasc politica de securitate a bazei de date. De exemplu, este acceptabil s avei un nivel sczut de securitate fa de utilizatori ntr-un calculator didactic unde studenii nva programarea calculatoarelor, n schimb, vei impune o securitate strict pentru calculatoarele unei bnci. Un alt aspect care se ncadreaz n domeniul gestionrii utilizatorilor bazei de date l reprezint licenierea. Pentru serverul dumneavoastr Oracle, avei o licen care stabilete numrul de utilizatori concureni care se pot conecta la baza de date. Prin gestionarea utilizatorilor i a drepturilor lor de acces, putei impune respectarea condiiilor licenei. Programul Oracle v pune la dispoziie numeroase instrumente cu care putei gestiona utilizatorii bazei de date. Procesul de gestionare a bazei de date include autentificarea utilizatorilor, crearea i gestionarea utilizatorilor, monitorizarea utilizatorilor i gestionarea resurselor. Acest capitol trateaz n detaliu aceste subiecte.
Autentificarea utilizatorilor
Programul Oracle v permite s autentificai utilizatorii prin dou metode diferite. Prima metod o reprezint autentificarea efectuat de baza de date Oracle. Programul Oracle solicit fiecrui utilizator s furnizeze un nume de utilizator i o parol atunci cnd ncearc s se conecteze la baza de date. Atunci cnd creai noi utilizatori, nu uitai s specificai clauza identified by. A doua metod de autentificare se bazeaz pe sistemul de operare. Cu aceast metod, pentru a autentifica utilizatorul, programul Oracle 95
folosete informaiile referitoare la utilizator, care sunt pstrate de sistemul de operare. Pentru utilizator, aceast metod prezint urmtoarele avantaje: - utilizatorul se poate conecta foarte simplu la baza de date fr s fie necesar s furnizeze un nume de utilizator i o parol. De exemplu, utilizatorul se poate conecta direct la baza de date, folosind comanda SQL*Plus; - controlul autorizrii utilizatorului cade n sarcina sistemului de operare i nu a serverului Oracle; - exist posibilitatea de auditare att din sistemul de operare, ct i din Oracle. Dac rulai un server cu fire multiple de execuie, nu exist posibilitatea ca utilizatorii s fie autentificai de sistemul de operare atunci, cnd ncearc s se conecteze. Aceasta este restricia prestabilit datorit faptului c exist riscul ca utilizatorul situat la distan s introduc numele i parola altui utilizator al sistemului de operare atunci, cnd se conecteaz la baza de date prin intermediul reelei. Pentru a modifica aceast opiune prestabilit, i a permite accesul de la distan ntr-un server cu fire multiple de execuie, atribuii parametrului de iniializare valoarea True.
Crearea utilizatorilor
Putei crea un nou utilizator al bazei de date folosind caseta de dialog Create User a utilitarului SQL*DBA sau comanda SQL create user. Atunci cnd creai un nou utilizator, trebuie s specificai urmtoarele informaii: Numele utilizatorului - un identificator care este unic n raport cu toate celelalte nume de utilizatori i roluri. Spaiul-tabel prestabilit pentru segmente - identific spaiul-tabel pentru obiectele pe care le creeaz utilizatorul. n mod prestabilit, acesta este spaiul-tabel al sistemului. Spaiul-tabel pentru segmentele temporare - identific spaiul-tabel pentru segmentele temporare ale utilizatorului. n mod prestabilit, acesta este spaiul-tabel al sistemului. Cotele spaiului-tabel - permite utilizatorului s aloce spaiu n spaiultabel i, opional, stabilete o cot n octei. 96
Profilul - atribuie utilizatorului un profil nominalizat. Profilul limiteaz resursele bazei de date pe care le poate accesa utilizatorul. Dac utilizatorului nu i se atribuie n mod explicit un profil, atunci el va avea profilul prestabilit. Acest profil prestabilit este stabilit de administratorul bazei de date i conine parametrii care definesc limitele prestabilite pentru toate resursele bazei de date. Exemplul urmtor creeaz noul utilizator al bazei de date identificat prin user_01: create user user_01 identified by A12345 default tablespace ts_101 temporary tablespace ts_temp quota 5m on ts_101 quota 5m on ts_temp quota 3m on system profile clerk; Clauza identified by stabilete parola utilizatorului. Dac dorii ca sistemul de operare s efectueze autentificarea utilizatorului, nlocuii clauza identified by cu clauza identified externally. Utilizatorul nou creat nu se poate conecta la baza de date pn cnd nu i se acord privilegiul de sistem connect. Pentru a schimba parola unui utilizator, lansai comanda alter user, dup cum este ilustrat n exemplul urmtor. Acest exemplu stabilete noua parol B12345 pentru utilizatorul tom_01: alter user tom_01 identified by B12345;
care pot fi atribuite unui utilizator. In general aceste resurse se stabilesc la nivel de sesiune i la nivel de apeluri. De fiecare dat cnd un utilizator se conecteaz la baza de date, este creat o sesiune. Aceast sesiune necesit o anumit cantitate de timp CPU i de memorie pe calculatorul gazd. Dac este depit limita unei resurse la nivel de sesiune, instruciunea curent este derulat napoi i utilizatorului i este returnat un mesaj de eroare. Atunci cnd se ntmpl acest lucru, toate instruciunile din tranzacia curent sunt intacte, iar utilizatorul are de ales numai ntre comenzile commit i rollback. n plus, n acest moment utilizatorul poate pur i simplu s ncheie sesiunea. Dac utilizatorul ncearc s efectueze orice alt operaie, programul Oracle genereaz o eroare. n timpul procesrii comenzilor SQL, sunt efectuate mai multe apeluri, ca parte a execuiei instruciunii. Dac este depit limita unei resurse la nivel de apel, procesarea instruciunii curente este ntrerupt i este derulat napoi. De asemenea, programul Oracle returneaz utilizatorului un mesaj de eroare. Toate instruciunile anterioare ale tranzaciei curente rmn intacte, iar sesiunea utilizatorului poate s continue. Administratorul bazei de date are posibilitatea s activeze sau s dezactiveze profiluri n mod global. Cu alte cuvinte, administratorul bazei de date are posibilitatea s stabileasc pentru anumite resurse, limite care s fie valabile pentru toi utilizatorii. Pentru a crea un profil, lansai comanda SQL create profile sau folosii caseta de dialog Create Profile a programului SQL*DBA. Pentru a crea profiluri, trebuie s posedai privilegiul de sistem create profile. La crearea profilului, vei stabili n mod explicit limitele urmtoarelor resurse: sessions_per_user Limiteaz numrul de sesiuni simultane pentru utilizator. cpu_per_session Limiteaz timpul CPU pentru o sesiune. Valoarea este exprimat n sutimi de secunde. cpu_per_call Limiteaz timpul CPU pentru un apel. Valoarea este exprimat n sutimi de secunde. connect_time Limiteaz timpul total de conectare a unei sesiuni. idle_t ime Definete durata maxim de inactivitate continu. 98
logical_read_per_session Limiteaz numrul de blocuri de date citite ntr-o sesiune. logical_reads_per_call Limiteaz numrul de blocuri de date citite pentru ca un apel s proceseze o instruciune SQL. private_sga Limiteaz cantitatea de spaiu privat pe care o sesiune o poate rezerva n zona global a sistemului. Aceast limit este aplicabil numai dac folosii un server multicanal. composite_limit Limiteaz costul total al resurselor pentru o sesiune. Este o combinaie a urmtoarelor resurse: cpu_per_session, connect_time, logical_reads_per_session i private_sga. Pentru a defini costul asociat acestor resurse, folosii comanda SQL alter resource cost. Pentru fiecare resurs definit n comanda create profile, putei include cuvintele cheie unlimited i default. Cuvntul cheie unlimited indic faptul c un utilizator cruia i se atribuie profilul respectiv poate utiliza o cantitate nelimitat a acestei resurse. Cuvntul cheie default indic faptul c utilizatorul resursei respective face obiectul limitei resursei specificate n profilul prestabilit. Programul Oracle creeaz automat profilul prestabilit. n mod prestabilit, acest profil definete iniial resurse nelimitate. Administratorul bazei de date poate modifica limitele profilului prestabilit cu comanda alter profile. Orice utilizator cruia nu i s-a atribuit n mod explicit un profil face obiectul limitelor resurselor definite n profilul prestabilit. Instruciunea urmtoare creeaz profilul numit funcionar". Aceast instruciune definete n mod explicit numai patru resurse. Toate celelalte resurse vor avea limitele definite de profilul prestabilit. create profile functionar iimit sessions_per_user 1 connect_time 560 cpu_per_call unlimited idle_tiine 15; Instruciunea alter profile redefinete resursa specificat, atribuindu-i valoarea furnizat. De exemplu, instruciunea urmtoare modific profilul funcionar, atribuind parametrului sessions_per_user valoarea 3, i stabilete o limit explicit 99
pentru logical_reads_per_call. Limitele tuturor celorlalte resurse rmn neschimbate. alter profile functionar limit sessions_per_user 3 logical_reads_per_call 100; Dup ce profilul a fost creat, atribuii-l unui utilizator cu comenzile SQL create user sau alter user. De asemenea, putei folosi casetele de dialog Create User sau Alter User ale programului SQL*DBA. Nu putei atribui profiluri rolurilor sau altor profiluri. De asemenea, un utilizator nu poate avea n acelai timp dou profiluri. Exemplul urmtor asociaz profilul funcionar utilizatorului tom_01. Acest nou profil intr n vigoare la urmtoarea sesiune. Alter user tom_01 profile functionar; Pentru a distruge un profil, lansai comanda drop profile cu clauza cascade.
Distrugerea utilizatorilor
Distrugerea unui utilizator elimin utilizatorul i schema asociat din dicionarul de date, precum i toate obiectele coninute n schema utilizatorului. Pentru a distruge toate obiectele utilizatorului, specificai clauza cascade n comanda drop user. Dac specificai clauza cascade, programul Oracle distruge automat orice restricii de integritate prin referin, asociate tabelelor din alte scheme care fac referire la cheile principale i la cheile unice ale tabelelor distruse. Uneori va trebui ca schema utilizatorului s rmn intact, pentru a susine operaiile altor utilizatori. n acest caz, revocai pur i simplu accesul utilizatorului la baza de date, prin eliminarea privilegiului de sistem create any session. Eliminarea din baza de date a utilizatorului se poate face cu ajutorul programului SQL*DBA. Pentru ca un utilizatorul s poat fi distrus, acesta trebuie s nu fie conectat la baza de date sau s nu aib nici un proces activ. Persoana care elimin utilizatorul trebuie s posede privilegiul de sistem drop user.
100
Mersul lucrrii:
Pentru a ndeplini operaiile care urmeaz intrai n sistemul Oracle cu numele de administrator System i parola Manager. Nu uitai s creai fiierul-spuller. Not. n dependen de starea spaiului predefinit al sistemul Oracle (din cauza c au lucrat ali colegi), unele date de ieire pot fi diferite de cele menionate mai jos. n referat explicai aceste deosebiri.
101
user_users - Informaii despre toi utilizatorii cureni bazei de date. Aceste informaii includ numele fiecrui utilizator, user_id, i spaiile-tabel folosite de fiecare. Culegei: select * from user_users; Rezultatul:
USERNAME USER_ID DEFAULT_ TEMPORARY_ CREATED TABLESPACE TABLESPACE -------- --------- ------------------------------ --SCOTT 8 USER_DATA TEMPORARY_DATA 16-SEP-96
dba_users - Informaii despre utilizatori ai bazei de date. Aceste informaii includ numele fiecrui utilizator, user_id, i spaiile-tabel folosite de fiecare. user_ts_quotas - Informaii despre cotele spaiului-tabel al utilizatorului. Culegei: select * from user_ts_quotas; Rezultatul:
TABLESPACE_NAME BYTES MAX_BYTES BLOCKS MAX_BLOCKS ----------------------- --------- ------- ---------USER_DATA 204800 0 100 0
dba_ts_quotas - Informaii despre cotele spaiilor-tabel pentru toi utilizatorii. Culegei: select * from dba_ts_quotas; Rezultatul: no rows selected user resource_limits - Afieaz limitele resurselor pentru utilizatorul curent. dba_profiles - Informaii despre limitele resurselor atribuite fiecrui profil. resource_cost - Afieaz costul fiecrei resurse.
Liceniere
Programul Oracle v ajut s respectai angajamentul de licen ncheiat cu firma Oracle. Avei o licen care definete numrul maxim admis de utilizatori simultani. De asemenea, s-ar putea s avei o licen 102
n care utilizatorii sunt nominalizai. n ambele cazuri trebuie s cunoatei limitele privind numrul utilizatorilor simultani. n momentul n care este atins limita impus bazei de date, numai utilizatorii avnd privilegiul de sistem restricted_session pot s se conecteze la baza de date. Atunci cnd se conecteaz un asemenea utilizator, este transmis ctre fiierul de avertizare i ctre ecran, un mesaj care afirm c a fost atins numrul maxim de utilizatori care lucreaz simultan. Pentru a v ajuta s respectai licena, sunt definii trei parametri de iniializare. Acetia sunt urmtorii: license_max_ sessions Definete numrul maxim de sesiuni concurente. license_sessions_ warning - Atribuii acestui parametru o valoare mai mic a parametrului license max_sessions. In acest fel, vei fi avertizat din timp c v apropiai de limita maxim de sesiuni concurente. license_max_users Definete numrul maxim de utilizatori concureni. Programul Oracle v pune la dispoziie vederea dicionarului de date v$license. Exemplul urmtor selecteaz i afieaz informaii coninute n aceast vedere. Culegei: select sessions_max s_max, sessions_warning s_warn, sessions_current s_curr, sessions_highwater s_high, users_max u_max from v$license; Rezultatul: S_MAX S_WARN S_CURR S_HIGH U_MAX ----- --------- --------- --------- --------0 0 2 2 0
Rezumat
n acest capitol ai aflat ce se nelege prin gestionarea utilizatorilor i, de asemenea, cum putei ndeplini aceast sarcin. Gestionarea 103
utilizatorilor bazei de date presupune, printre altele, autentificarea utilizatorilor, precum i crearea de profiluri utilizatorilor. Gestionarea utilizatorilor i a resurselor bazei de date este esenial pentru prevenirea consumului neraional al resurselor sistemului. Administratorul bazei de date folosete profilurile i tehnicile de autentificare pentru a gestiona accesul utilizatorilor la baza de date i consumul de resurse ale sistemului dup conectarea acestora la baza de date.
Rolurile
Rolurile sunt grupuri nominalizate de privilegii nrudite care sunt acordate utilizatorilor individuali sau altor roluri. Rolurile sunt create pentru gestionarea privilegiilor pentru o aplicaie de baze de date sau pentru gestionarea privilegiilor pentru un grup de utilizatori. Unui rol aplicaie i se acord toate privilegiile necesare rulrii unei aplicaii. O aplicaie poate avea mai multe roluri. Practic, vei defini un rol pentru fiecare tip de utilizator al aplicaiei. De exemplu, ntr-un magazin ai putea avea un rol pentru casier i un rol diferit pentru gestionarul magazinului Rolurile utilizator sunt create pentru un grup de utilizatori cu aceleai privilegii. Gestionarea privilegiilor individuale este mai simpl i mai eficient atunci cnd privilegiile sunt atribuite rolurilor, care sunt apoi acordate utilizatorilor individuali. Rolurile au o serie de caracteristici care simplific gestionarea privilegiilor bazei de date. Aceste caracteristici sunt urmtoarele: Gestionarea simplificat a privilegiilor. Acest lucru deriv din faptul c privilegiile sunt acordate rolurilor, care, la rndul lor, sunt acordate utilizatorilor. Nu este necesar s acordai toate privilegiile tuturor utilizatorilor - acordai-le pur i simplu rolul. Gestionare dinamic a privilegiilor individuale. Atunci cnd privilegiile unui rol se modific, aceste privilegii modificate sunt automat acordate utilizatorilor crora le-a fost acordat acest rol. Securitatea aplicaiei. Aplicaiile pot interoga dicionarul de date pentru a activa sau a dezactiva automat un rol, atunci cnd un utilizatorul ncearc s execute o aplicaie prin intermediul unui anumit nume de utilizator. Acest lucru permite aplicaiilor s activeze rolurile corespunztoare parolei. 104
Rolurile sunt grupuri nominalizate de privilegii pe care un utilizator Oracle le poate acorda unui alt utilizator Oracle sau unui alt rol.
Crearea rolurilor
Rolurile sunt create cu comanda SQL create role sau cu caseta de dialog Create Role a programului SQL*DBA. Instruciunea urmtoare creeaz rolul numit funcionar: create role functionar identified by Y8DS20J; Rolurile pot fi create cu ajutorul casetei de dialog Create Role a programului SQL*DBA. Aceast caset de dialog efectueaz aceleai aciuni ca i instruciunea SQL anterioar. Clauza identified by stabilete o parol care este folosit la activarea rolului. Ca alternativ, putei folosi clauza identified externally, dac dorii ca sistemul de operare s verifice utilizatorul i s activeze rolul. Clauza not identified poate fi folosit pentru a indica faptul c rolul nu trebuie verificat atunci cnd este activat. Numele pe care l atribuii rolului trebuie s fie unic n raport cu numele utilizatorilor i numele celorlalte roluri ale bazei de date. Rolurile nu sunt stocate n schema nici unui utilizator. Atunci cnd este creat un rol, acesta nu are asociat nici un privilegiu. n aceast faz, este un rol inutil. Trebuie s asociai sau alte roluri noului rol. Pentru a atribui privilegii i roluri noului rol, folosii comanda SQL grant. Acordarea privilegiilor este tratat mai amnunit ceva mai trziu n acest capitol. Pentru a crea un rol, trebuie s posedai privilegiul de sistem create role. De asemenea, atunci cnd creai un rol, acesta v este acordat cu opiunea admin. Opiunea admin v permite s efectuai urmtoarele operaii: S acordai acest rol unui alt utilizator sau rol. S retragei rolul unui utilizator sau unui rol. S modificai rolul pentru a schimba autorizaia necesar accesrii acestuia. S distrugei rolul.
105
Modificarea rolurilor
Putei schimba metoda de autorizare pentru un rol folosind comanda SQL alter role sau caseta de dialog Alter Role a programului SQL*DBA. Iat articolele pe care le putei modifica: Parola necesar pentru activarea rolului. Vrei ca rolul s fie verificat atunci cnd este activat? n caz afirmativ, stabilii dac verificarea rolului va fi efectuat de programul Oracle sau de sistemul de operare. Exemplul urmtor stabilete o nou parol i specific faptul c verificarea rolului urmeaz s fie efectuat de sistemul de operare: alter role funcionar identified by JL10C3Q Pentru a modifica un rol, trebuie fie s posedai privilegiul de sistem alter any role, fie s v fi fost acordat rolul respectiv cu opiunea admin.
106
Distrugerea rolurilor
Pentru a elimina un rol din baza de date, folosii caseta de dialog Drop Role a programului SQL*DBA sau lansai comanda SQL drop role. Domeniile de securitate ale tuturor utilizatorilor i rolurile pe care le posed un rol distrus sunt actualizate automat, pentru a reflecta absena privilegiilor rolului distrus. Distrugerea unui rol duce la eliminarea acestuia din lista de roluri prestabilite a utilizatorului. Instruciunea urmtoare elimin din baza de date rolul funcionar: drop role funcionar;
Acordarea rolurilor
Rolurile pot fi acordate tuturor utilizatorilor, altor roluri sau Public-ului. Public-ul reprezint toi utilizatorii sistemului. Pentru a face acest lucru, folosii comanda SQL grant sau caseta de dialog Grant System Privilege/Role a programului SQL*DBA. Instruciunea urmtoare acord rolul manager cu opiunea admin utilizatorului ABCDH: grant manager to ABCDH with admin option; Un rol de sistem poate fi acordat cu opiunea admin. Aceast opiune permite utilizatorilor s fac urmtoarele: S acorde sau s retrag rolul oricrui alt utilizator sau rol din baza de date. 107
S acorde rolul cu opiunea admin altor utilizatori sau roluri. S modifice sau s distrug rolul. Creatorului unui rol i este acordat automat rolul respectiv cu opiunea admin. n mod implicit, aceast comand d posibilitatea utilizatorului s acorde rolul altor utilizatori. Orice utilizator cu privilegiul de sistem grant any privilege poate acorda orice rol din baza de date. Toate rolurile acordate utilizatorilor, altor roluri sau Public-ului, devin efective numai dup ce sesiunea utilizator curent lanseaz o comand set role pentru a reactiva rolul dup ce a fost acordat. De asemenea, acordarea unui rol devine efectiv i atunci cnd este creat o nou sesiune utilizator dup acordarea rolului.
Retragerea rolurilor
Rolurile pot fi retrase folosind caseta de dialog Revoke System Privilege/Role a programului SQL*DBA sau comanda SQL revoke. Exemplul urmtor retrage utilizatorului tom_01 rolul funcionar: revoke functionar from tom_01; Nu putei retrage n mod selectiv opiunea admin a unui rol. Pentru a retrage opiunea admin, trebuie s retragei rolul, dup care s reacordai rolul fr opiunea admin. Orice utilizator posesor al opiunii admin poate retrage rolul oricrui alt utilizator sau rol. Un utilizator nu-i poate retrage un rol lui nsui. De asemenea, orice utilizator posesor al privilegiului grant any role poate retrage orice rol. Toate rolurile retrase utilizatorilor, altor roluri sau Public-ului, devin efective numai dup ce sesiunea utilizator curent lanseaz o comand set role pentru a reactiva rolul dup ce a fost retras. De asemenea, retragerea unui rol devine efectiv i atunci, cnd este creat o nou sesiune utilizator dup retragerea rolului.
date. Ca regul, grupului Public i vor fi acordate numai acele roluri care sunt necesare tuturor utilizatorilor bazei de date.
a - Caracter facultativ, care indic faptul c acest rol este acordat cu opiunea admin. lat dou exemple de identificatori ai sistemului de operare: ora_contabilitate_functionar ora sisteme programator a; Dac rolurile sunt gestionate de ctre sistemul de operare, toate rolurile anterioare acordate utilizatorilor cu comanda SQL grant nu au efect. Aceste roluri apar n continuare n dicionarul de date, ns nu sunt active. Numai rolurile acordate de ctre sistemul de operare sunt active pentru utilizator. Ca s aib loc toate acestea, parametrul de iniializare os_roles trebuie s aib valoarea True.
DEMO RESOURCE NO YES PO7 DBA NO YES SCOTT CONNECT NO YES SCOTT RESOURCE NO YES SYS CONNECT YES YES SYS DBA YES YES SYS EXP_FULL_DATABASE YES YES SYS IMP_FULL_DATABASE YES YES SYS RESOURCE YES YES SYSTEM DBA YES YES Urmtorul exemplu folosete tabelul DBA_ROLES pentru a afla dac anumite roluri sunt protejate prin parol. Culegei: select * from dba_roles; Rezultatul: ROLE PASSWORD ---------------------- -------CONNECT NO RESOURCE NO DBA NO EXP_FULL_DATABASE NO IMP_FULL_DATABASE NO - pentru cazul cnd nu a fost acordat nici un rol, sau, de exemplu: ROLE PASSWORD ----------------FUNCTIONAR NO ADMINISTRATOR YES DBA NO Dac rolurile FUNCTIONAR, ADMINISTRATOR, DBA au fost acordate Culegei: select * from user_role_privs; Rezultatul: USERNAME GRANTED_ROLE ADM DEF OS_ ----------- --------------- --- --- --SYSTEM DBA YES YES NO Culegei: select * from role_sys_privs; 111
Rezultatul: ROLE PRIVILEGE ADM ------------------ ---------------------- --DBA ALTER ANY CLUSTER YES DBA ALTER ANY INDEX YES DBA ALTER ANY PROCEDURE YES DBA ALTER ANY ROLE YES .. IMP_FULL_DATABASE DROP USER NO IMP_FULL_DATABASE EXECUTE ANY PROCEDURE NO IMP_FULL_DATABASE INSERT ANY TABLE NO IMP_FULL_DATABASE SELECT ANY TABLE NO 120 rows selected. Culegei: select * from role_tab_privs; Rezultatul:
ROLE TABLE_NAME PRIVILEGE GRA COLUMN_NAME ------------------ ------ ---------------------------EXP_FULL_DATABASE SYS INCEXP DELETE NO EXP_FULL_DATABASE SYS INCEXP INSERT NO EXP_FULL_DATABASE SYS INCEXP UPDATE NO EXP_FULL_DATABASE SYS INCFIL DELETE NO EXP_FULL_DATABASE SYS INCFIL INSERT NO EXP_FULL_DATABASE SYS INCFIL UPDATE NO EXP_FULL_DATABASE SYS INCVID DELETE NO EXP_FULL_DATABASE SYS INCVID INSERT NO EXP_FULL_DATABASE SYS INCVID UPDATE NO OWNER
9 rows selected.
Rezumat
n acest capitol, ai aflat c rolurile sunt colecii de privilegii care pot fi acordate anumitor utilizatori sau altor roluri. Rolurile simplific i mbuntesc activitatea de administrare a privilegiilor de sistem. Gruparea privilegiilor la un loc sub forma unui rol i apoi acordarea acestui rol utilizatorilor sau altor roluri asigur un sistem simplu i flexibil de gestionare a privilegiilor. 112
Rolurile sunt create n conformitate cu necesitile diverselor grupuri de utilizatori. Odat create, rolurile sunt acordate utilizatorilor i altor roluri.
Privilegii
Un privilegiu este permisiunea de a executa o aciune sau de a accesa un obiect aparinnd altui utilizator. n Oracle nu putei efectua nici o aciune daca nu avei privilegiul s o facei. Iat cteva exemple de privilegii: - dreptul de a accesa o baz de date; - dreptul de a selecta date din tabelele altui utilizator; - dreptul de a executa procedurile rezidente ale altui utilizator; - dreptul de a crea noi utilizatori. Privilegiile sunt acordate utilizatorilor pentru ca acetia s poat s efectueze aciunile necesare pentru ndeplinirea unei sarcini. Privilegiile pot fi acordate utilizatorului n mod explicit sau prin intermediul unui rol. Trebuie s se acorde numai privilegiile necesare. Exist dou categorii de privilegii: privilegii sistem i privilegii obiect. Privilegiile sistem permit utilizatorului s efectueze o aciune asupra obiectelor de un anumit tip, n timp ce privilegiile obiect permit utilizatorului s efectueze o aciune asupra unui anumit obiect. Privilegiile reprezint una dintre cele mai importante mijloace pentru asigurarea securitii bazei de date. Nu putei efectua nici o aciune n baza de date dect dac avei privilegiul sau permisiunea de a efectua respectiva aciune. Privilegiile permit administratorului bazei de date s atribuie nivelurile adecvate de securitate obiectelor bazei de date i utilizatorilor. Privilegiile sunt puse la dispoziie de serverul Oracle, ca parte a propriei scheme de securitate intern. Utilizatorilor li se acord privilegii pentru a efectua anumite aciuni. De asemenea, utilizatorilor le pot fi retrase privilegii. Acest capitol trateaz diversele privilegii de sistem i de obiect i modul de administrare a acestora.
Privilegii de sistem
Un privilegiu de sistem este dreptul sau permisiunea de a executa o anumit aciune asupra unui anumit obiect. De exemplu, dreptul de a crea un spaiu-tabel este un privilegiu de sistem. Exist peste 80 de privilegii de sistem distincte. 113
ntruct privilegiile de sistem sunt foarte puternice, ele trebuie acordate cu msur utilizatorilor autorizai. n continuare, sunt enumerate privilegiile de sistem ale programul Oracle. Denumirile acestor privilegii sunt inspirate de aciunile pe care le permit Analyze (any table, object sau cluster): - analyze any Audit (orice obiect de schem al bazei de date): - audit any - audit system Cluster: - create cluster - create any cluster - alter any cluster - drop any cluster Database: - alter database Database Link: - create database link Index - create any index - alter any index - drop any index Privilege: - grant any privilege Procedure: - create procedure - create any procedure - alter any procedure - drop any procedure - execute any procedure Profile - create profile - alter profile - drop profile - alter resource cost Public Database Link: - create public database link 114
- drop public database link Public Synonym: - create public synonym - drop public synonym Role: - create role - alter any role - drop any role - graht any role Rollback Segment: - create rollback segment - alter rollback segment - drop rollback segment Sequence: - create sequence - create any sequence - alter any sequence - drop any sequence - select any sequence Session: - create session - alter session - restrict session Snapshot: - create snapshot - create any snapshot - alter any snapshot - drop any snapshot Synonym: - create synonym - create any synonym - drop any synonym System: - alter system Table: - create table - create any table - alter any table 115
- back up any table - drop any table - lock any table - comment any table - select any table - insert any table - update any table - delete any table Tablespace: - create tablespace - alter tablespace - manage tablespace - drop tablespace - unlimited tablespace Transaction: - force transaction - force any transaction Trigger: - create trigger - create any trigger - alter any trigger - drop any trigger User - create user - become user - alter user - drop user View : - create view - create any view - drop any view
Privilegiile de sistem nu pot fi acordate mpreun cu privilegiile de obiect i cu rolurile n aceeai comand grant. Pentru a acorda privilegii de sistem, trebuie s posedai opiunea admin pentru privilegiul de sistem pe care l acordai sau s posedai privilegiul de sistem grant any privilege.
Privilegii de obiect
Un privilegiu de obiect este permisiunea de a efectua o aciune asupra unui anumit obiect, cum ar fi un tabel, un pachet sau o vedere. Anumite obiecte ale bazei de date nu posed un privilegiu de obiect asociat. De exemplu, urmtoarele obiecte nu posed privilegii de obiect: declanatorii, grupurile, indecii i legturile cu baze de date. Privilegiile de obiect difer de la un obiect la altul. n continuare, sunt prezentate privilegiile de obiect disponibile i obiectele asociate acestora: 117
Alter: - Tabele - Secvene Delete: - Tabele - Vederi Execute: - Proceduri (de sine stttoare i subprograme) Index: - Tabele Insert: - Tabele - Vederi Reference: - Tabele Select: - Tabele - Vederi - Secvene Update: - Tabele - Vederi
revoke update on lst_articole from tom_01; Nu putei s retragei n mod explicit privilegii specifice coloanelor. pentru a face acest lucru, trebuie nti s retragei privilegiile de obiect Pentru toate coloanele unui tabel sau unei vederi, dup care s reacordai n mod selectiv privilegiile specifice coloanelor care vrei s rmn. Retragerea privilegiilor de obiect provoac de obicei un efect n cascad. De exemplu, dac ntr-o procedur sau o funcie este utilizat o instruciune DML n legtur cu un obiect pentru care au fost revocate privilegiile, procedura sau funcia devine invalid.
all_tab_privs - afieaz informaii despre obiectele n legtur cu care utilizatorul sau Publicul posed privilegii; all_tab_privs_made - afieaz informaii despre tabelele n legtur cu care utilizatorul este proprietar de privilegii sau a acordat privilegii; all_tab_privs_recd - afieaz informaii despre tabelele n legtur cu care utilizatorul sau publicul au primit privilegii; user_ro1e_privs - afieaz rolurile acordate utilizatorului; user_sys_privs - afieaz privilegiile de sistem acordate utilizatorului; column_privileges - afieaz informaii despre coloanele n legtur cu care utilizatorul este proprietarul unor privilegii, cele n legtur cu care a primit sau a acordat privilegii, precum i cele n legtur cu care publicul a primit privilegii; sessions_privs - Afieaz privilegiile care sunt disponibile pentru utilizator n momentul respectiv. Exemplele urmtoare interogheaz aceste vederi ale dicionarului de date pentru a obine informaii despre privilegii. Primul exemplu furnizeaz informaii despre posesorul fiecrui privilegiu. Culegei: select * from dba_sys_privs; Rezultatul: GRANTEE PRIVILEGE ADM --------- ---------------------- --CONNECT ALTER SESSION NO CONNECT CREATE CLUSTER NO CONNECT CREATE DATABASE LINK NO CONNECT CREATE SEQUENCE NO CONNECT CREATE SESSION NO .. SCOTT UNLIMITED TABLESPACE NO SYS DELETE ANY TABLE NO SYS INSERT ANY TABLE NO SYS SELECT ANY TABLE YES SYS UPDATE ANY TABLE NO SYSTEM UNLIMITED TABLESPACE YES 141 rows selected. 120
Exemplul urmtor folosete tabelul SESSIONS_PRIVS pentru a afia privilegiile de sistem acordate utilizatorului: select * from sys_privs; Rezultatul: PRIVILEGE -------------CREATE SESSION AUDIT ANY sau ERROR at line 1: ORA-00942: table or view does not exist
Rezumat
Un privilegiu este permisiunea sau dreptul de a executa un anumit tip de instruciune SQL sau de a accesa obiectele altui utilizator. Exist dou tipuri de privilegii: de sistem i de obiect. n acest capitol, ai aflat c privilegiile sunt unul dintre cele mai importante controale ale bazei de date. Prin intermediul privilegiilor, controlai accesul utilizatorului la obiectele bazei de date i la datele acestora. Privilegiile sunt acordate n mod explicit utilizatorilor i rolurilor. Odat acordat un privilegiu, utilizatorul poate efectua aciunea la care i d dreptul privilegiul respectiv.
121
ANEXE
Lista cuvintelor rezervate Oracle SQL:
ACCESS - Face un obiect al bazei de date disponibil utilizatorilor. ADD - Utilizat n instruciuni SQL pentru a aduga o coloan sau o restricie de integritate. ALL - Specific un operator de comparaie sau determin un grup de funcii s ia n considerare toate valorile dintr-un set de selecie specificat. ALTER - Utilizat n numeroase instruciuni, pentru a redefini valorile curente ale instruciunii. AND - Operator logic. ANY - Operator logic. AS - Clauz utilizat mpreun cu comanda create pentru a insera n tabel (n momentul crerii lui) liniile returnate de subinterogare. ASC - Pentru crearea unei liste ascendente; se utilizeaz, de exemplu, mpreun cu indeci. AUDIT - Activeaz auditarea instruciunilor sau obiectelor specificate. BETWEEN - Operator de comparaie. CHAR - Un tip de date CHARACTER de lungime fix. CHECK - O restricie care definete n mod explicit o condiie. CLUSTER - O metod de a stoca la un loc date din mai multe tabele atunci, cnd datele liniilor respective conin informaii comune care sunt de obicei accesate n mod concurent. COLUMN - O subdiviziune a unui tabel care posed un nume i un anumit tip de date. COMMENT - Comand utilizat pentru inserarea n dicionarul de date a unui comentariu referitor la un tabel sau la o coloan. CONNECT - Salveaz toate modificrile, v deconecteaz, de la baza de date Oracle, dup care v conecteaz la baza de date Oracle ca utilizator definit. CREATE - Utilizat pentru crearea unui anumit obiect al bazei de date. CURRENT - Utilizat mpreun cu cursoare pentru a specifica ultima linie preluat. DATE - Un tip de dat DATE de lungime fix utilizat pentru stocarea datelor calendaristice i a orelor. DECIMAL - Tip de dat DECIMAL care specific numere zecimale de lungime fix. 122
DEFAULT - O clauz sau o valoare opional care este folosit atunci, cnd nu este specificat nici o alternativ. DELETE - Comand utilizat pentru eliminarea liniilor dintr-un tabel sau din tabelul de baz al unei vederi. DESC - Este utilizat pentru crearea listelor descendente (de obicei mpreun cu indeci). DISTINCT - Parte a unei instruciuni care indic unicitatea. DROP - Pentru ndeprtarea sau eliminarea complet a unui obiect din baza de date. ELSE - Instruciune care evalueaz dou condiii care pot avea valoarea TRUE. EXCLUSIVE - Utilizat pentru cuplarea bazei de date n mod exclusiv. Cu alte cuvinte va fi cuplat o singur instan la un moment dat. EXISTS - Operator care returneaz valoarea True ntr-o clauz WHERE dac subinterogarea care urmeaz returneaz cel puin o linie. FILE - Zon de stocare utilizat pentru stocarea tuturor datelor bazei de date. FLOAT - Tipul de date FLOAT. FOR - Utilizat n structuri iterative, pentru limitarea numrului de ori de care este executat o instruciune. GRANT - Utilizat pentru a acorda privilegii utilizatorilor i rolurilor. HAVING - Limiteaz grupul de linii returnate la acelea pentru care condiia specificat are valoarea TRUE. IDENTIFIED - Folosit n momentul modificrii specificaiilor unui utilizatorindic modul n care programul Oracle permite accesul utilizatorului. IMMEDIATE - Utilizat ntr-o comand alter tablespace care nu verific dac fiierele spadului-tabel sunt disponibile i nu efectueaz o verificare la imprimare. IN - Un operator logic utilizat ntr-o clauz WHERE. INCREMENT - Folosit la crearea secvenelor pentru indicarea intervalului dintre numerele secveniale. INDEX - Un obiect al bazei de date utilizat pentru mbuntirea vitezei de acces. INITIAL - Specific cerinele iniiale de spaiu de stocare. INSERT - Utilizat pentru adugarea liniilor ntr-un tabel sau n tabelele de baz ale unei vederi. INTEGER - Tipul de date INTEGER. 123
INTERSECT - Un operator set care returneaz liniile comune din dou seturi distincte de linii. INTO - Specific tabelul sau obiectul care constituie receptorul unei aciuni. IS - Folosit mpreun cu operatorul logic NULL (Null nu este operator logic!) pentru a testa prezena unei valori. LEVEL - Aceasta este o pseudocoloan care ia valoarea 1 pentru nodul rdcin, 2 pentru nodul copil i 3 pentru copilul unui nod copil. LIKE - Folosit pentru a compara un ir de caractere cu modelul specificat. LOCK - Mecanisme Oracle utilizate pentru a limita accesul utilizatorilor la un anumit obiect. LONG - Tipul de date LONG reprezentnd date de tip caracter, de lungime variabil i cu o limit maxim de 2 gigaoctei. MAXEXTENTS - Specific numrul maxim de extinderi care pot fi alocate pentru un anumit obiect. MINUS - Un operator set care returneaz toate liniile distincte care exist n prima interogare, dar nu i n a doua. MODE - Stabilete modul procesului: mono-procesor sau multiprocesor. MODIFY - Modific definiia unei coloane existente a unui tabel. NOAUDIT - ncheie activitile de auditare pentru a anumit instruciune sau un anumit obiect. NOT - Precede i inverseaz efectul operatorilor logici. NOWAIT - Indic programului Oracle s v returneze controlul atunci, cnd obiectul este deja blocat de un alt utilizator. NULL - Indic absena unei valori. NUMBER - Tipul de date NUMBER reprezint numere reale de lungime variabil i cu o anumit precizie. OF - Precede o list de articole care urmeaz s fie evaluate. OFFLINE - Trece un anumit obiect n stare offline i mpiedic accesarea ulterioar a acestuia. ON - Identific obiectul asupra cruia va aciona instruciunea. ONLINE - Trece un anumit obiect n stare online i l face accesibil utilizatorilor. OPTION - Utilizat pentru a specifica o list de opiuni pentru instruciunea respectiv. 124
OR - Un operator care combin dou expresii al cror rezultat este TRUE sau FALSE. ORDER - Asigur crearea unei liste de numere n ordinea specificat. PCTFREE - Specific pentru fiecare obiect procentul de spaiu rezervat pentru actualizrile viitoare ale obiectului. PRIOR - Un operator care evalueaz o expresie specificat pentru linia printe a liniei curente ntr-o ierarhie. PRIVILEGE - Permisiune acordat unui utilizator, de a efectua o anumit aciune. PUBLIC - Un grup al bazei de date la care au acces toi utilizatorii bazei de date. RAW - Tipul de date RAW. Acest tip are format binar i nu trebuie interpretat direct. RENAME - nlocuiete numele unui obiect cu un nou nume. RESOURCE - Este un nume generic pentru o resurs a bazei de date sau un dispozitiv fizic. REVOKE - Retrage privilegii utilizatorilor sau rolurilor. ROWID - Aceasta este o pseudocoloan care reprezint adresa logic a unei linii ntr-un tabel. ROWLABEL - Coloan creat automat n fiecare tabel de programul Trusted Oracle. ROWNUM - Aceasta este o pseudocoloan care conine un numr ce indic ordinea n care programul Oracle selecteaz liniile dintr-un tabel reprezentnd un set de linii reunite. ROW - O colecie de informaii din coloanele unui tabel care corespunde unei singure nregistrri. ROWS - Una sau mai multe linii de date dintr-un tabel. SELECT - Comand SQL utilizat pentru preluarea datelor din unul sau mai multe obiecte ale bazei de date. SESSION - O conexiune a unui utilizator la o instan a bazei de date. SET - Utilizat pentru activarea unui element specificat. SHARE - Permite partajarea unui obiect sau a unei resurse. SIZE - Specific dimensiunea resursei n octei. SMALLINT - Un tip de date compatibil din DB2 pentru tipul de date number la programului Oracle. START - Utilizat pentru a iniia o aciune cum ar fi pornirea unei baze de date. 125
SYNONYM - Un alias pentru un tabel sau o vedere care poate fi folosit pentru a face referire la tabelul sau vederea n cauz. SYSDATE - Data i ora sistemului. TABLE - Unitatea de baz de stocare ntr-o baz de date Oracle. Un tabel este compus din linii i coloane. THEN - Asociaz condiia care l preced cu instruciunea care urmeaz. TO - Identific elementul asupra cruia va fi efectuat o aciune. TRIGGER - O procedur rezident asociat cu un tabel, care este executat automat, la producerea unui eveniment specificat. UID - Pseudocoloan care conine un numr unic atribuit fiecrui utilizator. UNION - Funcie SQL care combin rezultatele a dou interogri. UNIQUE - Specific faptul c un articol trebuie s fie distinct n raport cu toate articolele de acelai fel. UPDATE - Comand pentru modificarea valorilor dintr-un tabel sau din tabelele de baz ale unei vederi. USER - Pseudocoloan care conine numele de conectare al utilizatorului. VALUES - Atribuie o list de valori coloanelor corespunztoare. VARCHAR - Tipul de date VARCHAR; acesta este variabil ca lungime i poate avea o lungime maxim de 200 de octei. VARCHAR2 - Tipul de date VARCHAR2; acesta este variabil ca lungime i poate avea o lungime maxim de 200 de octei. n versiunea 7 a programului Oracle, acest tip de date este sinonim cu VARCHAR. VIEW - Un obiect al bazei de date care constituie o reprezentare logic a unuia sau mai multor tabele. WHENEVER - Folosit mpreun cu comanda audit pentru specificat auditarea unei instruciuni, numai n cazul cnd instruciunea este executat cu succes. WHERE - Folosit n instruciuni pentru a specifica liniile care urmeaz s fie afectate de comanda respectiv. WITH - Furnizeaz un element suplimentar care va fi inclus n instruciune.
126
EXIT - Salveaz toate modificrile n ateptare ale bazei de date, prsete programul SQL*Plus i cedeaz controlul sistemului de operare. GET - ncarc n buffer un fiier al sistemului de operare gazd. HELP - Acceseaz sistemul de asisten soft al programului SQL*Plus. HOST - Execut o comand a sistemului de operare gazd fr prsirea programului SQL*Plus. INPUT - Adaug n buffer una sau mai multe linii dup linia curent. LIST - Afieaz una sau mai multe linii din buffer. PAUSE - Afieaz o linie goal urmat de o linie care conine text, dup care ateapt ca utilizatorul s apese tasta Return. Ca alternativ, acest cuvnt rezervat poate duce la afiarea a dou linii goale, urmate de ateptarea rspunsului utilizatorului. PRINT - Afieaz valoarea curent a unei variabile de legtur. PROMPT - Afieaz mesajul specificat sau o linie goal pe ecranul utilizatorului. REMARK - ncepe un comentariu ntr-un fiier de comenzi. RUN - Afieaz i execut comanda SQL sau blocul PL/SQL care se afl n bufferul SQL. RUNFORM - Apeleaz o aplicaie SQL*Forms din cadrul programului SQL*Plus. SAVE - Salveaz coninutul buffer-ului ntr-un fiier al sistemului de operare gazd (un fiier de comenzi). SET - Stabilete un aspect al mediului SQL*Plus pentru sesiunea curent. SHOW - Afieaz valoarea unei variabile de sistem SQL*Plus. SPOOL - Stocheaz rezultatele interogrilor ntr-un fiier al sistemului de operare i, opional, transmite fiierul la imprimanta prestabilit. SQL*Plus - Pornete programul SQL*Plus de la promptul sistemului de operare. START - Execut coninutul fiierului de comenzi specificat. TTITLE - Plaseaz i formateaz un titlu specificat n partea superioar a fiecrei pagini a raportului, sau afieaz definiia curent a titlului. UNDEFINE - Elimin variabila definit utilizator specificat pe care ai definit-o fie explicit (cu comanda define), fie implicit (cu un argument n comanda start). 128
VARIABLE - Declar o variabil de legtur care poate fi definit n PL/SQL. WHENEVER OSERROR - Prsete programul SQL*Plus dac o comand a sistemului de operare genereaz o eroare. WHENEVER SQLERROR - Prsete programul SQL*Plus dac o comand SQL sau un bloc PL/SQL genereaz o eroare.
Simboluri
!= (inegalitate), operator de comparaie, % (semnul procent), caracter de nlocuire, * (asterisc) instruciunea select, operator de nmulire, = (operator de inegalitate), || (operator de concatenare), + (semnul plus) operator de adunare, operatorul outer join, (cratim) caracter de nlocuire, operator de scdere, - - (dublu minus), comentarii, / (bar) comand SQL*Plus, operator de mprire, /*,*/ (comentarii multi-linie), : (dou puncte), referirea variabilelor variabile de legtur, variabile gazd, := (operator de atribuire), < (operatorul mai mic dect), (paranteze unghiulare duble), etichete pentru cicluri, < = (operatorul mai mic sau egal cu), < > (operatorul de inegalitate), = (operatorul de egalitate), > (operatorul mai mare dect), > = (operatorul mai mare sau egal cu), @ comand (SQL*Plus), @@ comand (SQL*Plus),
2. George Gardarin. Bases de donnes objet & relationnel. Edition Eyrolles, 1999. 3. G.Gardarin. Bases De Donnes. EYROLLES 4. Abdelaziz Abdellatif, Mohamed Limame, Abdelmalek Zeroual. Oracle7. Langages - Architecture - Administration. EYROLLES 5. . Tom Luers . Oracle 7. Versiunea 7.2. Teora. Bucuresti, 2000 6. . S. Miranda. A. Ruols. Client-Serveur. EYROLLES 7. . P. Marcenac. SGBD relationnelles. EYROLLES 8. . C. Pascu, A. Pascu. Totul despre SQL. Editura tehnic. Bucuresti, 1994. 9. C. G. Date. Introduction aux bases de donnes. Vubert Informatique Paris 2000.
130