Sunteți pe pagina 1din 26

Dictionarul de Date Oracle

Dictionarul de Date este una din partile cele mai importante ale lui ORACLE RDBMS. Consta dintr-un set de tabele si vederi care furnizeaza un ghid de referinta accesibil doar la citire, despre baza de date. Dictionarul de Date va va spune: numele utilizatorilor ORACLE drepturile si privilegiile care le-au fost acordate numele obiectelor bazei de date (tabele, vederi, indecsi, sinonime,sec- vente,...) constrangeri aplicate tabelei informatii de revizie, ca: cine a accesat si actualizat obiectele bazei de date specificate. Dictionarul de Date este creat cand este creata baza de date. Oricand baza de date este in operatii, Dictionarul de Date este actualizat de ORACLE RDBMS. Dictionarul de Date este o referinta pentru toti utilizatorii bazei de date. Este o sursa valoroasa de informatii pentru utilizatori, proiectanti de aplicatii si DBA.

Accesul la Dictionarul de Date


Utilizatori Accesul la obiectele Dictionarului de Date este prin SQL. Declaratiile SELECT pot fi folosite pentru a cere informatii din Dictionarul de Date. RDBMS Nici un utilizator nu ar trebui sa schimbe vreodata (insereze, actualizeze sau stearga) nici o linie sau obiect in Dictionarul de Date, este probabil sa compromita integritatea datelor. RDBMS actualizeaza automat Dictionarul de Date pentru a reflecta schimbarile structurii bazei de date, permisiuni, re- vizii si alte date. In timpul operatiei bazei de date, RDBMS citeste dease- menea Dictionarul de Date pentru a descoperi obiectele care exista si ca uti- lizatorii sa aiba acces la ele.

Tabelele si vederile Dictionarului de Date


Tabele Baza Dictionarului de Date sau fundamentul tabelelor sunt primele obiecte ce trebuie create in baza de date, pentru ca ele trebuie sa fie prezente pentru toate obiectele ce trebuie create. Tabelel Dictionarului de Date sunt create automat de declaratia SQL CREATE DATABASE si nu sunt in posesia utilizatorului SYS. Tabelele de baza sunt rareori accesate direct, deoarece informatia din ele nu este usor de inteles. Vederi Vederile Dictionarului de Date contin informatii intr-o forma care este usor de inteles pentru utilizator. Accesul public la Dictionarul de Date este dat prin vederi mai degraba decat prin tabele de baza. SYS poseda deasemenea vederile Dictionarului de Date.

Vederile au fost numite pentru a reflecta tipul de utilizare dorit. Vederile sunt clasificate in 3 grupe distingandu-se intre ele prin prefixele USER, ALL si DBA. Cele trei clase de vederi sunt: USER_xxxxx Obiectele posedate de utilizator pot fi accesate. De exemplu, vederile cu acest prefix permit utilizatorului sa afiseze informatii despre tabelele create de utilizator si privilegiile acordate de utilizator. ALL_xxxxx Utilizatorii pot accesa obiecte la care le-au fost permise drepturile de acces, in plus fata de obiectele pe care le poseda. DBA_xxxxx Pentru utilizare de catre utilizatori cu privilegiu DBA - pot accesa orice obiect in baza de date. Unele dintre vederile Dictionarului de Date nu utilizeaza prefixele listate mai sus. Aceste vederi includ: DICTIONARY Listeaza toate tabelele, vederile, Dictionarului de Date, accesibile utilizatorului. DICT_COLUMNS Listeaza coloanele in dictionarul obiectelor accesibile utilizatorului. CONSTRAINT_DEFS Listeaza toate definitiile de constrangeri introduse pentru tabelele accesibile utilizatorului. CONSTRAINT_COLUMNS Listeaza toate coloanele care sunt accesibile utilizatorului curent si numite in definitiile constrangerilor.

Vederea DICTIONARY
DICTIONARY listeaza toate obiectele Dictionarului de Date accesibile utilizatorului cu o scurta descriere a obiectului. Urmatoarea declaratie SQL afiseaza continutul tabelei DICTIONARY : SELECT * FROM DICTIONARY; Multe din vederile Dictionarului de Date au nume lung. Sinonimele publice au fost furnizate, ca abreviatii, pentru accesul convenabil la unele din cele mai comune vederi ale Dictionarului de Date utilizator. Numele Tabelei Comentarii ----------------------ALL_CATALOG secven ALL_COL_COMMENTS vederiALL_COL_PRIVS utiliza "grantee",proprietar, grantee" Toate tabelele, vederile, sinonimele, tele accesibile utilizatorului Comentarii pe coloanele tabelelor si le accesibile Permisiuni pe coloanele pentru care torul este "grantor", sau un rol posibil sau PUBLIC este

ALL_COL_PRIVS_MADE Permisiuni pe coloanele pentru care utilizatorul e proprietar sau "grantor"

ALL_COL_PRIVS_RECD utiliza "granALL_CONSTRAINTS accesi ALL_CONS_COLUMNS accesibile in ALL_DB_LINKS utilizaALL_DEF_AUDIT_OPTS obiecte ALL_DEPENDENCIES obiectele acceALL_ERROR la care

Permisiuni pe coloanele pentru care torul, PUBLIC sau rolul posibil este tee" Definitii de constrangeri pe tabele bile Informatii despre coloanele definitiile de constrangeri Legaturile bazei de date accesibile torului Optiuni de revizuire pentru noile create Dependente dinspre si inspre sibile utilizatorului Erorile curente pe obiectele stocate utilizatorul este permis sa creeze Descrierea indecsilor pe tabelele Coloanele cuprinzand indecsi pe sibile Obiectele accesibile utilizatorului Descrierea SEQUENCE-urilor accesibile zatorului Sursa curenta a obiectelor create pe tilizatorul are permisiunea sa le Toate sinonimele accesibile Descrierea tabelelor accesibile lui

ALL_INDEXES accesibile utilizatorului ALL_IND_COLUMNS tabele acce ALL_OBJECTS ALL_SEQUENCES utili ALL_SOURCE care u creeze ALL_SYNONYMS utilizatorului ALL_TABLES utilizatoru

ALL_TAB_COLUMNS vederilor si ALL_TAB_COMMENTS accesibile u ALL_TAB_PRIVS utilizato proprietar,

Coloanele tuturor tabelelor, clusterelor Comentarii pe tabele si vederi tilizatorului Permisiuni pe obiecte pentru care rul e "grantor", "grantee" sau sau un rol posibil sau PUBLIC garantie

ALL_TAB_PRIVS_MADE Permisiunile utilizatorilor si permisiuni pe obiectele utilizatorilor ALL_TAB_PRIVS_RECD utilizato "granALL_TRIGGERS curent ALL_TRIGGER_COLS utiliza tabelele utiALL_USERS bazei de date ALL_VIEWS utilizatorilor AUDIT_ACTIONS de urma CAT CLU COLS COLUMN_PRIVILEGES utilizato proprietar, sau "grantee" DICT Permisiuni pe obiecte pentru care rul, PUBLIC sau un rol posibil este tee" TRIGGER-uri accesibile utilizatorului Utilizarea coloanelor in trigger-ul torilor sau in trigger-uri pe lizatorilor Informatii despre toti utilizatorii Textul vederilor accesibile Tabela de descriere pentru actiunea rire a reviziei tipului de coduri Sinonim cu USER_CATALOG Sinonim cu USER_CLUSTERS Sinonim cu USER_TAB_COLUMNS Permisiuni pe coloane pentru care rul e "grantor", "grantee", un rol posibil sau PUBLIC este Sinonim cu DICTIONARY

DICTIONARY Dictiona GLOBAL_NAME IND INDEX_HISTOGRAM repetata INDEX_STATS OBJ RESOURCE_COSTS ROLE_ROLE_PRIVS ROLE_SYS_PRIVS ROLE_TAB_PRIVS SEQ SESSION_PRIVS setat SESSION_ROLES facut posi SYN TABLE_PRIVILEGES utilizatorul sau un "granTABS USER_AUDIT_OBJECTS pentru deanume: secventa, sinonim rollutilizator

Descrierea tabelelor si vederilor rului de Date Numele bazei de date globale Sinonim pentru USER_INDEXES Statistica pe chei cu numarare Statistica pe arbori-B Sinonim pentru USER_OBJECTS Costul fiecarei resurse Roluri permise rolurile Privilegiile sistem permise rolurilor Privilegii de tabela permise rolurilor Sinonim pentru USER_SEQUENCES Privilegii pe care utilizatorul le-a in mod curent Roluri pe care utilizatorul le-a bile in mod curent Sinonim pentru USER_SYNONYMS Alocatii pe obiecte pe care este "grantor", "grantee", posesor, rol facut posibil, sau PUBLIC este tee-ul" Sinonim pentru USER_TABLES Inregistrarea urmelor examinate claratii referitoare la obiecte, si tabel, cluster, vedere, index, legatura bazei de date [publica], [public], procedura, trigger, segment back, spatiu de tabela, rol,

USER_AUDIT_SESSION USER_AUDIT_STATEMENT referitoare neexaminaUSER_AUDIT_TRAIL relevante uUSER_CATALOG poseda USER_CLUSTERS utilizatorului USER_CLU_COLUMNS aduna TABLENAMECOMMENTS USER_COL_COMMENTS si ve USER_COL_PRIVS utiliza"granUSER_COL_PRIVS_MADE obiectelor USER_COL_PRIVS_RECD utilizato USER_CONSTRAINTS tabelele uti USER_CONS_COLUMNS accesibile in USER_DB_LINKS utiliComentarii despre coloanele tabelelor derile utilizatorului Permisiuni pe coloanele pentru care torul este posesorul, "grantor" sau tee" Toate permisiunile pe coloanele posedate de utilizator Permisiuni pe coloane pentru care rul este "grantee" Definitiile constrangerilor pe lizatorului Informatii despre coloanele definitiile constrangerilor Legaturile bazei de date posedate de zator Inregistrarea urmelor examinate la alocatie, anulare, examinare, re si sistem modificat Intrari ale urmelor revizuite, tilizatorului Tabele, vederi, sinonime si secvente te de utilizator Descrieri ale clusterelor Maparea coloanelor tabelei pentru a impreuna coloanele

USER_DEPENDENCIES obiectele utiUSER_ERRORS posedate USER_EXTENTS utilizatoUSER_FREE_SPACE accesi USER_INDEXES USER_IND_COLUMNS utilizatoruUSER_OBJECTS USER_OBJECT_SIZE obiecte USER_OBJ_AUDIT_OPTS si vede USER_RESOURCE_LIMITS utilizatorului USER_ROLE_PRIVS USER_SEGMENTS segmentele USER_SEQUENCES USER_SNAPSHOTS poate ve USER_SNAPSHOTS_LOGS de utiUSER_SOURCE utilizaUSER_SYNONYMS

Dependente dinspre si inspre lizatorilor Erori curente pe obiecte stocate, de utilizator Extensii cuprinzand segmente ale rului Extensii libere in spatiul tabelelor bile utilizatorului Descrierea indecsilor utilizatorului Coloanele cuprinzand indecsi ai lui sau pe tabele ale utilizatorului Obiecte posedate de utilizator Dimensiuni, in octeti, a diferitelor pl/sql Optiuni de revizuire pentru tabelele rile utilizatorului Afiseaza limita resurselor Roluri permise utilizatorului curent Spatiu de stocare alocat pentru bazei de date Descrierea SEQUENCE-lor utilizatorului Instantanee pe care utilizatorul le dea Toate jurnalele instantanee posedate lizator Sursa obiectelor stocate accesibile torului Sinonimele private ale utilizatorului

USER_SYS_PRIVS utilizatorului USER_TABLES USER_TABLESPACES accesibile USER_TAB_COLUMNS clustereUSER_TAB_COMMENTS pose-

Privilegii de sistem permise curent Descrierea tabelelor utilizatorului Descrierea spatiilor tabelelor Coloane ale tabelelor, vederilor si lor utilizatorului Comentarii despre tabelele si vederile date de utilizator Permisiuni pe obiecte pentru care rul este posesorul, "grantor-ul", sau tee-ul"

USER_TAB_PRIVS utilizato"granUSER_TAB_PRIVS_MADE de uUSER_TAB_PRIVS_RECD utilizatoUSER_TRIGGERS USER_TRIGGER_COLS utilizatoru USER_TS_QUOTAS utilizator USER_USERS USER_VIEWS

Toate permisiunile pe obiecte posedate tilizator Permisiuni pe obiecte pentru care rul este "grantee-ul" Tigger-uri posedate de utilizator Folosirea coloanei in trigger-ul lui Cota spatiului de tabela pentru Informatii despre utilizatorul curent Text de vederi posedat de utilizator

Cateva vederi folositoare


Urmatoarele vederi sunt probabile de a fi de interes pentru majoritatea utilizatorilor: Nume vedere Sinonim Descriere -------------------------DICTIONARY date USER_OBJECTS Dict Obj Lista tuturor obiectelor bazei de Obiectele posedate de utilizator

USER_CATALOG accesi USER_TABLES USER_TAB_COLUMNS utiliUSER_COL_COMMENTS si vede USER_TAB_COMMENTS posedate de u USER_SEQUENCES utiliUSER_SYNONYM USER_VIEWS utilizator USER_INDEXES utilizatoru ALL_OBJECTS ALL_TAB_COLUMNS vederi

Cat

Tabele, vederi, sinonime, secvente bile utilizatorului

Tabs Cols

Descrierea tabelelor utilizatorului Coloanele din tabelele si vederile zatorului Comentarii pe coloanele tabelelor rilor utilizatorului Comenzi pe tabele si vederi tilizator

Seq

Descrierea secventelor posedate de zator

Syn

Sinonimul privat al utilizatorului Textul vederilor posedate de

Ind

Descrierea indecsilor proprii lui Obiectele accesibile utilizatoruluI Coloanele pentru toate tabelele si

le accesibile utilizatorului Daca nu stiti definitia unei tabele sau vederi a Dictionarului de Date, sau daca nu va puteti aminti numele unei coloane intr-o tabela/vedere specifica, atunci folositi comanda DESC[RIBE] pentru a afisa definitia tabelei/vederii. Pentru a vedea structura lui USER_OBJECTS, introduceti: SQL>desc user_objects O descriere a vederii DICTIONARY urmeaza: SQL>desc dict Notati ca sinonimul abreviat DICT poate fi folosit cu referire la DICTIONARY. Odata ce stiti structura unei tabele/vederi, puteti selecta informatia dori- ta: SELECT FROM WHERE OBJECT_NAME, OBJECT_TYPE, CREATED USER_OBJECTS OBJECT_NAME = 'EMP'

TRANZACTII
Procesarea unei Tranzactii
Ce este o tranzactie ? O tranzactie este o operatie asupra unei baze de date care implica una sau mai multe modificari in una sau mai multe tabele. Exista doua clase de tranzactii. Tranzactii DML care contin un numar oarecare de blocuri DML si pe care ORACLE le trateaza ca o singura entitate sau o singura unitate logica de lucru, si tranzactii DDL care contin un singur bloc DDL. Nu pot exista situatii "jumatate de drum" in timpul executiei unei tranzactii, asa incat unele modificari specificate in tranzactie sa fie aplicate bazei de date si altele nu. Pentru fiecare tranzactie ori toate modificarile sunt aplicate bazei de date, ori nici una din modificari nu este indeplinita ( sunt toate abandonate - discarded ). O tranzactie incepe cand prima comanda executabila DML sau DDL este intalnita si se termina in una din urmatoarele situatii : Intalneste COMMIT/ROLLBACK Comanda DDL se termina Anumite erori (DEADLOCK) EXIT - iesire din SQL*Plus Eroare sistem Un bloc DDL este executat automat si de aceea implicit incheie o tranzactie. Dupa incheierea unei tranzactii, urmatorul bloc executabil SQL va lansa automat urmatoarea tranzactie. Permanentizarea Modificarilor Pentru ca modificarile sa ramana permanente, ele trebiue executate asupra bazei de date. comanda COMMIT realizeaza permanentizarea modificarilor; ROLLBACK permite sa abandonam sau sa anulam modificarile. Modificarea, sau modificarile, executate asupra bazei de date intre 2 comenzi COMMIT reprezinta o tranzactie. Pana cand tranzactia nu este executata, nici una din modificari nu este vizibila utilizatorilor. Inlaturarea Modificarilor Nedorite Modificarile neexecutate pot fi abandonate prin comanda ROLLBACK. ROLLBACK va atribui datelor valorile care acestea le aveau imediat dupa executarea ultimului COMMIT prin anularea tuturor modificarilor facute dupa ultimul COMMIT. Erorile de Sistem Cand o tranzactie este intrerupta de o eroare serioasa, de exemplu o eroare de sistem, intreaga tranzactie este anulata. Aceasta previne erorile datorate modificarilor nedorite asupra datelor, si realizeaza intoarcerea tabelelor la starile de dupa ultimul COMMIT. In acest fel SQL*Plus protejeaza integritatea tabelelor. Anularea automata este cauzata cel mai des de catre o eroare de sistem, ca de exemplu o resetare a sistemului sau o cadere de tensiune. Erorile de tastare a comenzilor, ca de exemplu tastarea gresita a unor nume de coloane sau incercarile de a realiza operatii neautorizate asupra tabelelor altor utilizatori, nu intrerup tranzactia si nu realizeaza anu-larea automata. Aceasta se datoreaza faptului ca aceste erori sunt detectate in cursul compilarii (de catre PARSER) (cand un bloc SQL este scanat si verificat), si nu in timpul executiei. O tranzactie noua este lansata urmand unui COMMIT sau ROLLBACK - adica cand primul bloc executabil DML sau DDL este intalnit.

Semnificatia Tranzactiilor
ORACLE asigura consistenta datelor bazata pe tranzactii. Tranzactiile dau utilizatorului mai multa flexibilitate si control la lucrul asupra datelor, si asigura consistenta datelor in cazul unei erori a procesului utilizator sau a unei erori de sistem. Tranzactiile ar trebui sa contina doar acele comenzi DML care realizeaza o singura modificare asupra datelor. De exemplu un transfer de fonduri (sa spunem 1000$) intre 2 conturi ar trebui sa implice un debit al unui cont de 1000$ si un credit al altui cont de 1000$. Ambele

actiuni ar trebui sa se incheie cu succes sau sa dea eroare impreuna. Creditul nu ar trebui executat fara debit.

Controlul Tranzactiilor cu Instructiuni SQL


Urmatoarele instructiuni SQL sunt utilizate cand apar executii (commit) sau refaceri (rollback) : COMMIT[WORK] SAVEPOINT nume_savepoint ROLLBACK[WORK] to [SAVEPOINT] nume_savepoint De notat ca COMMIT si ROLLBACK sunt instructiuni (blocuri) SQL. Cele 3 blocuri SQL utilizate pentru controlul tranzactiilor sunt explicate mai jos: COMMIT[WORK] Sintaxa : COMMIT[WORK]; Permanentizeaza schimbarile in tranzactia curenta Sterge toate punctele de salvare (savepoint) din tranzactie Termina tranzactia Elibereaza toate blocarile (Lock) tranzactiei Cuvantul cheie WORK este optional Utilizatorul trebuie sa expliciteze sfarsitul tranzactiei in programul aplicatie utilizand COMMIT (sau ROLLBACK). Daca nu se executa explicit tranzactia si programul se termina anormal, ultima tranzactie executata va fi anulata. Executii implicite (commit) apar in urmatoarele situatii : inainte de o comanda DDL dupa o comanda DDL la inchiderea normala a unei baze de date Blocurile DDL cauzeaza mereu executii (commit) in timpul executiei lor. Daca introduceti un bloc DDL dupa cateva blocuri DML, blocul DDL cauzeaza aparitia unui commit inaintea propriei executii, incheind tranzactia curenta. Astfel daca blocul DDL este executat pana la capat, este si inregistrat. SAVEPOINT Sintaxa : SAVEPOINT nume_savepoint Exemplu : SAVEPOINT terminare_actualizari Poate fi utilizat pentru a imparti o tranzactie in bucati mai mici Punctele de salvare (savepoints) permit utilizatorului sa retina toata munca sa la orice moment din timp, cu optiunea de a inregistra mai tarziu totul sau a anula totul sau o parte din ea. Astfel, pentru o tranzactie lunga, se pot salva parti din ea, pe masura executiei, la sfarsit inregistrandu-se sau refacandu-se continutul initial. La aparitia unei erori nu trebuie executat din nou fiecare bloc. La crearea unui nou punct de salvare cu acelasi nume ca al unuia dinainte, primul punct este sters. Numarul maxim de puncte de salvare pentru un proces utilizator este implicit 5. Aceasta limita poate fi schimbata. ROLLBACK[WORK] to [SAVEPOINT] nume_punct_salvare Instructiunea ROLLBACK este utilizata pentru a reface un lucru. Cuvantul cheie "work" este optional. Intoarcerea la un punct de salvare este de asemenea optionala. Daca se utilizeaza ROLLBACK fara clauza TO SAVEPOINT, atunci : se termina tranzactia se anuleaza modificarile din tranzactia curenta sterge toate punctele de salvare din tranzactie elibereaza blocarile tranzactiei

Intoarcerea la Nivel de Bloc


O parte a unei tranzactii poate fi anulata. Daca un singur bloc DML da eroare, ORACLE va intoarce inapoi doar acel bloc. Aceasta facilitate este cunoscuta ca STATEMENT LEVEL ROLLBACK. Intoarcerea la nivel de bloc inseamna daca un singur segment DML da eroare la executia unei tranzactii, efectul lui este anulat, dar schimbarile realizate de precedentul bloc DML in tranzactie nu vor fi anulate si pot fi inscrise (COMMIT) sau intoarse (ROLLBACK) explicit de catre utilizator. Daca blocul este unul de tip DDL, inscrierea (commit) care precede imediat acest bloc nu este anulata (schimbarile au fost facute deja permanen-te). ORACLE realizeaza intoarcerea la nivel de bloc prin crearea unui punct de salvare implicit inainte de executarea fiecarei comenzi DML. Utilizatorul nu poate referi acest punct de salvare in mod direct. Astfel, daca va intoarceti la un punct de salvare, atunci: anulati o parte din tranzactie se retine punctul de salvare pentru intoarcere, dar se pierd toate celelalte punct create dupa punctul de salvare numit. se elibereaza toate blocarile de tabele si linii.

Intoarceri Implicite
Intoarcerile implicite apar cand se intalnesc terminari anormale ale executiei (de exemplu cand se intrerupe un proces utilizator). Intoarcerile implicite la nivel de bloc apar la eroarea de executie a unui bloc. Este recomandat ca tranzactiile sa se termine explicit utilizand COMMIT[WORK] ori ROLLBACK[WORK]. Urmatorul exemplu demonstreaza utilizarea unui punct de salvare, si a instructiunilor ROLLBACK si COMMIT. INSERT INTO DEPT VALUES ( 50, 'TESTING', 'LAS VEGAS' ); SAVEPOINT insert_done; UPDATE DEPT SET DNAME = 'MARKETING'; ROLLBACK TO insert_done ( modificarile sunt abandonate ); UPDATE DEPT SET DNAME = 'MARKETING' ( revizuim comanda UPDATE ) WHERE DNAME = 'SALES'; COMMIT; AUTOCOMMIT COMMIT sau ROLLBACK pot fi date manual sau automat prin utilizarea optiunii AUTOCOMMIT a comenzii SET. Optiunea AUTOCOMMIT controleaza cand schimbarile intr-o baza de date sunt facute permanente. Exista doua setari : COMANDA + DESCRIEREA

SET AUTO[COMMIT] ON COMMIT este utilizat automat la fiecare INSERT, UPDATE sau DELETE SET AUTO[COMMIT] OFF

COMMIT poate fi utilizata de utilizator explicit. De asemenea, COMMIT se executa cand apare comanda Z (specifica VAX), cand se executa comenzile DROP, ALTER sau CREATE, sau la iesirea din SQL*Plus. ROLLBACK poate fi executat explicit de catre utilizator pentru refacerea bazei de date.
De retinut ca SET este o comanda SQL*Plus.

Consistenta la Citire
Utilizatorii bazelor de date fac doua tipuri de accesuri asupra bazelor de date: Operatii de citire ( SELECT ) Operatii de scriere ( INSERT, UPDATE, DELETE ) Cititorului si scriitorului unei baze de date trebuie sa i se garanteze o vedere consistenta asupra bazei de date. Cititorii nu trebuie sa vizualizeze o data care este in curs de modificare. Si scriitorii trebuie sa fie siguri ca schimbarile intr-o baza de date sunt facute intr-un mod consistent : schimbarile facute de un scriitor sa nu distruga sau sa intre in conflict cu schimbarile pe care le face un alt scriitor. Scopul consistentei la citire este acela de a asigura faptul ca fiecare utilizator vede data ca fiind cea de la ultimul COMMIT, inainte ca o operatie DML sa inceapa. Consistenta la citire este implementata prin tinerea unor copii partiale ale bazei de date in segmente de intoarcere (ROLLBACK). Cand de executa operatii de scriere intr-o baza de date, ORACLE va face o copie a datelor inainte de schimbare si o va scrie intr-un segment de intoarcere. Toti cititorii, exceptandu-i pe cei care au facut schimbarile, inca mai vad baza de date care exista inainte ca schimbarile sa fie facute - ei vad segmentul de intoarcere de fapt. Oricum, inainte ca schimbarile sa fie facute permanente in baza de date, doar utilizatorul care modifica datele poate sa vada baza de date cu alteratiile incorporate. Toti ceilalti vad baza nemodificata ( fereastra din segmentul de intoarcere ). Aceasta garanteaza citirea unor date consistente care nu fac subiectul unor modificari in curs. Cand un bloc DML se executa, schimbarile facute in baza de date devin vizibile oricarui utilizator care executa SELECT. Modificarile sunt facute 'universale' si acum toti utilizatorii vad baza de date cu modificarile incorporate. Spatiul ocupat de catre 'vechile' date in segmentul de intoarcere este eliberate pentru a fi reutilizat. Daca tranzactia este anulata (ROLLBACK), atunci toate schimbarile sunt 'anulate' : Versiunea veche ('originala') a bazei de date aflata in segmentul de intoarcere este scrisa inapoi ('recuperata') in baza de date. Toti utilizatorii vad baza de date existenta inainte de inceperea tranzactiei.

Tranzactii de Citire
Implicit, modelul consistent al ORACLE RDBMS garanteaza ca rezultatul executiei unui bloc este consistent. Oricum, in anumite situatii se poate dori chestionarea unor blocuri multiple asupra datelor din mai multe tabele si se doreste asigurarea ca datele sunt consistente. Adica, rezultatele in orice tabela sunt consistente in timp in raport cu rezultatele din orice alta tabela. Linia SQL : SET TRANSACTION READ ONLY este utilizata pentru a incepe o tranzactie de citire exclusiv. Consistenta la citire pe care READ ONLY o furnizeaza este implementata in acelasi fel cu consistenta la nivel de bloc - utilizand segmente de intoarcere. Fiecare bloc vede implicit o fereastra consistenta a datelor la momentul inceperii blocului. Aceasta facilitate este foarte folositoare pentru rapoarte care ruleaza mai multe chestionari asupra mai multor tabele in timp ce alti utilizatori actualizeaza aceleasi tabele. Note : SET TRANSACTION READ ONLY este utilizata pentru a incepe o tranzactie doar de citire. Doar cereri ( blocuri SELECT ) sunt permise. Comenzile DML nu sunt permise. SELECT FOR UPDATE va genera o eroare. O instructiune COMMIT, ROLLBACK, sau un bloc DDL va termina tranzactia de citire ( de retinut ca blocurile DDL genereaza implicit suprascrieri -

COMMIT ). Cu blocuri DDL, nu este data nici o indicatie referitoare la faptul ca tranzactia se termina implicit. In timpul tranzactiei de citire, toate cererile se refera la aceeasi copie a bazei de date ( schimbarile sunt efectuate inainte ca tranzactia de citire sa inceapa). Alti utilizatori pot continua sa citeasca sau sa modifice datele. Urmatoarele seturi de instructiuni pot fi rulate pentru a extrage datele din tabelele EMP si DEPT. COMMIT; SET TRANSACTION READ ONLY; SELECT DEPTNO, ENAME, JOB FROM EMP; SELECT DEPTNO, DNAME FROM DEPT; COMMIT; Ultimul COMMIT este necesar pentru a termina explicit tranzactia de citire. Exercitii Exercitiile acopera inserarea si modificarea de coloane in tabelele create anterior. 1. Inserati in tabela PROJECTS urmatoarele informatii : PROJID P_DESC NOTES P_START_DATE P_END_DATE BUDGET_AMOUNT MAX_NO_STAFF COMMENTS 1 WRITE C030 COURSE 02-JAN-88 07-JAN-88 500 1 BE CREATIVE 2 PROOF READ 01-JAN-89 10-JAN-89 600 1 YOUR CHOICE

2. Inserati in tabela ASSIGNMENTS urmatoarele coloane: PROJID EMPNO A_START_DATE A_END_DATE BILL_RATE ASSIGN_TYPE HOURS 1 7369 01-JAN-88 03-JAN-88 50.00 WR 15 1 7902 04-JAN-88 07-JAN-88 50.00 WR 20 2 7844 01-JAN-89 10-JAN-89 45.50 PF 30

3. Modificati campul ASSIGNMENT TYPE astfel incat sa se citeasca 'WT' in loc de 'WR'. Un tip ca 'PF' trebuie sa ramana nemodificat. 4. Inserati inca doua proiecte cu atribuiri la alegere.

REZOLVARI:
1. INSERT INTO PROJECTS (PROJID, P_DESC, P_START_DATE, P_END_DATE, BUDGET_AMOUNT, MAX_NO_STAFF) VALUES (1,'WRITE C030 COURSE','02-JAN-88','07-JAN88',500,2); INSERT INTO PROJECTS (PROJID, P_DESC, P_START_DATE, P_END_DATE, BUDGET_AMOUNT, MAX_NO_STAFF) VALUES (2,'PROOF READ NOTES','01-JAN-89','10-JAN89',600,1); 2. INSERT INTO ASSIGNMENTS (PROJID, EMPNO, A_START_DATE, A_END_DATE,BILL_RATE, ASSIGN_TYPE, HOURS) VALUES (1,7369,'01-JAN-88','03-JAN-88',50.00,'WR',15); INSERT INTO ASSIGNMENTS (PROJID, EMPNO, A_START_DATE, A_END_DATE,BILL_RATE, ASSIGN_TYPE, HOURS) VALUES (1,7092,'04-JAN-88','07-JAN-88',50.00,'WR',20); INSERT INTO ASSIGNMENTS (PROJID, EMPNO, A_START_DATE, A_END_DATE,BILL_RATE, ASSIGN_TYPE, HOURS) VALUES (2,7844,'01-JAN-89','10-JAN-89',45.50,'PF',30); 3. UPDATE ASSIGNMENTS SET ASSIGN_TYPE='WT' WHERE ASSIGN_TYPE='WR';

Utilizatorii si Securitatea
Sistemul de securitate descentralizata a lui ORACLE este explicat in acest capitol. In special vom explica cum sa utilizati comenzile GRANT si REVOKE pentru a controla accesul la baza de date si sa inregistrati noi utilizatori cu diferite niveluri de drepturi de acces.

Privilegiile si Functiile Sistemului


ORACLE utilizeaza un sistem de securitate descentralizat, unde utilizatorii sunt ei insisi responsabili pentru acordarea drepturilor de acces pentru obiectele pe care le detin celorlalti utilizatori. Oricum, inainte ca ei sa faca aceasta, un utilizator va avea nevoie de drepturile importante ale sistemului care permit actiuni ca conectarea la o baza de date sau crearea de obiecte. Cand Administratorul Bazelor de Date a creat un nou utilizator ORACLE, un numar de drepturi pot fi atribuite pentru a defini tiputile de activitati ale bazelor de date pentru fiecare utilizator, este mult mai

convenabil pentru Administratorul Bazelor de Date de a grupa combinatiile obisnuite de drepturi in roluri (roles). rolurile corespunzatoare pot atunci fi asignate utilizatorilor.

Privilegiile Sistemului
Sunt mai mult de 80 tipuri de drepturi ale sistemului disponibile pentru atribuite catre utilizatori si roluri. Unele din cele mai importante sunt listate mai jos. Pentru o specificare completa, vedeti "Oracle Server SQL reference Manual".

Drept Sistem Operatii autorizate CREATE SESSION Permite posesorului conectarea la baza de date. CREATE TABLE Permite posesorului crearea de tabele. Uti- lizatorul trebuie de asemenea sa aiba o cota intr-o "tablespace" (arie a bazei de date). CREATE VIEW Permite crearea imaginilor. CREATE USER Permite posesorului sa creeze alti utilizatori ORACLE (un drept cerut pentru o functie DBA).

Roluri
Un rol este o colectie de drepturi sistem cu nume. Un utilizator poate avea acces la mai multe roluri, si mai multi utilizatori pot fi atribuiti aceluiasi rol, dandu-se flexibilitate si usurinta sistemului de securitate. Sunt cateva roluri predefinite, ca DBA ( Administrator de Baze de Date ) care include toate privilegiile sistemului, dar un DBA va crea de obicei roluri pentru cerintele sistemului. Daca aveti atribuite mai multe roluri, puteti oscila intre ele in timpul unei sesiuni pentru a activa sau nu drepturile asociate. Aceasta este realizata prin comanda SET ROLE. De exemplu, pentru a activa un rol care are parola "marigold" atasata : SET ROLE gardener IDENTIFIED BY marigold; Pentru a activa toate rolurile exeptand un singur rol pentru un uti- lisator : SET ROLE ALL EXCEPT manager; Pentru a deactiva toate rolurile : SET ROLE NONE; Un utilizator va avea unele roluri implicite care sunt activate la intrare in sesiune. Acestea sunt de obicei toate rolurile acordate utilizatorului, dar pot fi schimbate cu comanda ALTER USER.

ROLURI
Acordarea de drepturi Utilizatori fara roluri

o o o /|\ /|\ /|\ /^\ /^\ /^\ | | | +----+--+-------+-------+ | | | | | | | +-----|-+--+--|-+-----|-+ | | | | | | | | | | | +---|-|-+---|-|-++--|-|-+ /\+ | /\+ | /\+ | /\+ | \/--+ \/--+ \/--+ \/--+ DREPTURI

Acordarea de drepturi utilizand roluri

o o Utilizatori /|\ /|\ /^\ /^\ | / | / \ | / \ | / ++---+---++ | | <------------ ROL +--+---+--+ | | | | +-------+ | | +-------+ | | | | /\ /\ /\ /\ \/ \/ \/ \/ Privilegii

o /|\ /^\ \ \

Schimbarea Parolei Utilizatorului DBA atribuie utilizatorului o parola initiala cand utilizatorul este creat ( via CREATE USER ). Utilizatorul poate mai tarziu sa-si schimbe parola utilizand comanda ALTER USER. Sintaxa : ALTER USER nume_utilizator IDENTIFIED BY parola De exemplu : ALTER USER glenn IDENTIFIED BY swordfish; De notat ca de asemenea comanda poate fi utilizata pentru a schimba parola proprie, alte optiuni in ALTER USER pot necesita unele drepturi ale sistemului pentru a se incheia cu succes.

Comanda GRANT
Este utilizata pentru a atribui drepturile unui obiect catre un utilizator un rol Atribiurea unui utilizator : GRANT priv1, priv2, ... ON nume_obiect TO utilizator, utilizator, ... [ WITH GRANT OPTION ] Atribuirea catre un rol : GRANT priv1,priv2, ... ON nume_obiect TO rol, rol, ... 'nume_obiect' poate referi : o tabela o imagine (view) o secventa (sequence) un sinonim (synonym) o procedura o functie un pachet (package)

Privilegiile unui Obiect


Detineti fiecare tabela, imagine, secventa si sinonim pe care il creati. Daca nu doriti sa impartiti un astfel de obiect cu alti utilizatori ORACLE, doar dumneavoastra si orice DBA il poate accesa. Pentru a permite accesul altor utilizatori la obiectele bazei de date, utilizati comanda GRANT : GRANT ON TO drepturi obiect utilizator;

Tabelul de mai jos arata drepturile care pot fi acordate la tabele si imagini. Drept Obiect ---------SELECT date in tabele sau imagini INSERT linii in tabele sau imagini UPDATE linii sau coloane specificate intr-o tabela sau imagine DELETE linii dintr-o tabela sau imagine ALTER definitii de coloane in tabele INDEX indexare la o tabela REFERENCES se refera la o tabela numita in interiorul unei restrictii de tabela sau coloana. ALL De notat ca ALTER, INDEX si REFERENCES nu sunt valabile ca optiuni cu imagini. Doar ALTER si SELECT pot fi aplicate unor secvente. Cel mai simplu fel de GRANT este unul care acorda un singur drept unui singur utilizator. Pentru a acorda lui ADAMS dreptul de SELECT din tabela DEPT, introduceti :

GRANT ON TO Grant succeeded. Mesajul : Grant succeeded.

SELECT DEPT ADAMS;

confirma acordarea dreptului. Pentru a acorda dreptul UPDATE pentru anumite coloane lui ADAMS, introduceti : GRANT ON TO UPDATE ( DNAME, LOC ) DEPT ADAMS;

Pentru a acorda mai multe drepturi odata, introduceti toate drepturile separate prin virgule. Similar, pentru a acorda mai multe privilegii mai multor utilizatori, introduceti numele utilizatorilor separate prin virgule. Pentru a acorda drepturile INSERT si UPDATE asupra DEPT lui ADAMS si JONES, introduceti : GRANT ON TO INSERT, UPDATE DEPT ADAMS, JONES;

Grant succeeded. Pentru a acorda toate privilegiile asupra DEPT lui ADAMS, introduceti : GRANT ON TO Grant succeeded. Transmiterea de Privilegii care au fost Acordate. Cand s-a acordat un drept de acces, utilizatorul care primeste dreptul, in mod normal nu primeste si autorizarea de a transmite acest drept si altora. Pentru a da unui utilizator dreptul de a transmite dreptul mai departe, utilizati clauza WITH GRANT OPTION. Pentru a acorda dreptul SELECT asupra EMP lui ADAMS, cu autorizarea de a acorda acest drept si altora, introduceti : GRANT ON TO WITH Grant succeeded. Dreptul Public SELECT EMP ADAMS GRANT OPTION; ALL DEPT ADAMS;

Permite detinatorului unei tabele sa acorde accesul tuturor utilizatorilor cu o singura comanda, Acordarea da drept(uri) asupra unei tabele lui PUBLIC. GRANT ON TO SELECT EMP PUBLIC;

Pentru a permite accesul asupra secventei lui Ford -F_SEQ- lui BLAKE, FORD va introduce : GRANT SELECT ON F_SEQ TO BLAKE; Alte Obiecte Comanda GRANT pate fi utilizata pentru a permite accesul utilizatorilor asupra procedurilor stocate si functiilor. Puteti sa permiteti accesului unui rol asupra unui obiect. Fiecare utilizator caruia ii este asignat acel rol poate utiliza obiectul respectiv. De exemplu : GRANT SELECT ON EMP TO ROLE_2; Optiunea 'WITH GRANT OPTION' nu este permisa in acest caz. Violarea Drepturilor de Acces Daca incercati sa executati o operatie neutorizata (de exemplu stergerea dintr-o tabela fara a avea dreptul DELETE), ORACLE nu va permite ca operatia sa aiba loc. Daca primiti mesajul de eroare ORACLE ' table or view does not exist', aceasta poate insemna doua lucruri : aveti o tabela sau o imagine cu nume care nu exista ati incercat sa executati o operatie asupra acelei tabele sau imagini pentru care nu aveti drepturile corespunzatoare.

Comanda REVOKE
Pentru a retrage un drept acordat, utilizati comanda REVOKE. Este similara cu GRANT : REVOKE drepturi ON tabela sau imagine FROM utilizatori; Cand utlilzati comanda REVOKE, drepturile specificate sunt anulate utilizatorilor enumerati, si celorlalti utilizatori carora acestia le-au transmis aceste drepturi. Pentru a anula toate drepturile asupra DEPT de la ADAMS, introduceti REVOKE ON FROM ALL EMP ADAMS;

Revoke succeeded. Drepturile publice sunt retrase utilizand comanda REVOKE : REVOKE SELECT ON EMP FROM PUBLIC; Pentru a afla care utilizatori au drepturi asupra tabelelor, imaginilor sau secventelor dvs., executati o cerere catre imaginea Dictionarului de Date USER_TAB_GRANTS, sau USER_COL_GRANTS.

Crearea unui SYNONYM pentru o Tabela, Imagine sau Secventa


Pentru a referi o tabela detinuta de un alt utilizator, trebuie sa prefixati numele tabelei cu numele utilizatorului care a creat-o urmat de punct (.). Pentru a referi tabela EMP detinuta de SCOTT, introduceti : SELECT * FROM SCOTT.EMP; Alternativa este de a crea un sinonim ( alt nume ) pentru tabela sau imaginea data. Pentru a referi tabela EMP a lui SCOTT doar cu numele 'EMP', introduceti : CREATE SYNONYM EMP FOR SCOTT.EMP; Acum, cand executati o cerere asupra tabelei EMP a lui Scott, doar introduceti : SELECT FROM * EMP;

Doar DBA poate crea sinonime PUBLICe la care toti utilizatorii sa aiba acces. CREATE PUBLIC SYNONYM nume_sinonim for [proprietar.] nume_obiect; Un sinonim public poate fi eliminat prin tastarea : DROP [ PUBLIC ] SYNONYM nume_sinonim; Sinonimele sunt utilizate din motive de sceuritate si comoditate, incluzand : pentru a referi o tabela, secventa sau imagine fara a specifica detinatorul obiectului pentru a furniza un alt nume pentru tabela. Din motive de performanta, nu e recomandabila utilizarea de sinonime la referirea de tabele in aplicatii.

OBIECTE in BAZELE de DATE : SECVENTIALE si INDEXATE


Acest paragraf descrie cum se poate indexa o tabela pentru a imbunatati timpul de raspuns in cazul unei interogari. Crearea si utilizarea accesului secvential este de asemenea discutata (aceasta permite atribuirea automata de numere de secventa unice in cadrul unei aplicatii.) Generatorul de numere de secventa In server-ul Oracle , generatorul de numere de secventa poate fi utilizat pentru a genera automat numere de secventa pentru rinduri in cadrul tabelelor. De exemplu se poate folosi generatorul pentru a produce chei primare unice. Pentru a genera automat numere de secventa, trebuie sa definiti o secventa folosind comanda CREATE SEQUENCE. Sintaxa este urmatoarea: CREATE SEQUENCE [user.] sequence_name [ increment by n] [ start with n] [ maxvalue n | nomaxvalue ] [ minvalue n | nominvalue ] Toti parametrii comenzii sunt optionali si au urmatoarea semnificatie: user: proprietarul secventei.Implicit este user-ul care a generat comanda CREATE SEQUENCE sequence_name: numele de secventa care respecta conventiile SQL de denumire a obiectelor

INCREMENT BY: determina intervalul dintre numerele de secventa generate. Daca valoarea este pozitiva, atunci numerele de secventa vor creste. Daca valoarea este negativa atunci acestea vor scade. Se poate folosi orice intreg nenul. Implicit aceasta valoare este 1 START WITH: specifica primul numar de secventa care va fi generat. Implicit este 1 pentru indexi crescatori si MAXVALUE pentru indici descrescatori MINVALUE|valoarea minima a secventei ce va fi generata.Implicit este 1pentru indici crescatori si 10E27-1 pentru indici descrescatori MAXVALUE valoarea maxima ce va poate fi generata.Implicit este 1 pentru secvente descrescatoare, si -1 pentru secvente crescatoare. Orice incercare de a genera numere de secventa peste aceasta valoare va esua si se va intoarce un cod de eroare. Urmatoarea comanda creaza o secventa pentru coloana DEPTNO a tabelei DEPT. CREATE SEQUENCE dept_sep INCREMENT BY 10 START WITH 10 MAXVALUE 10000; Dupa ce o secventa a fost creata ea poate fi folosita pentru a genera numere unice de secventa. Generarea de numere de secventa cu NEXTVAL NEXTVAL este utilizata pentru a extrage numere de secventa succesive dintr-o secventa specificata. Cind se acceseaza NEXTVAL un nou numar de secventa este generat. SELECT dept_seq.NEXTVAL FROM SYS.DUAL ;; NEXTVAL ------------10 Daca se reexecuta comanda SQL anterioara valoarea creste cu 10. SELECT dept_seq.NEXTVAL FROM SYS.DUAL ;; NEXTVAL ------------20 Prima valoare obtinuta este 10 si aceasta se incrementeaza apoi cu pasul 10. Nota: intodeauna se prefixeaza NEXTVAL cu numele de secventa daca se refera NEXTVAL de mai multe ori pentru o singura comanda SQL orice referire va intoarce aceasi valoare. NEXTVAL este foarte folositoare in comenzi DML. De exemplu cind se completeaza o tabela se poate folosi o secventa pentru a produce valori unice pentru coloana cu cheii primare a tabelei. Exemplul urmator foloseste secventa dept_seq pentru a adauga cheii primare unice in tabela DEPT. INSERT INTO DEPT VALUES (dept_seq.NEXTVAL,

'ACCOUNTING', `NEW YORK');

1 record created SQL> SELECT * FROM DEPT; DEPTNO DNAME -----------10 LOC -------------ACCOUNTING -----------------NEW YORK

Inaintea versiunii 6, numere unice de secventa erau generate la nivelul aplicatiilor. De exemplu, o modalitate obisnuita de implementare este de a forta fiecare tranzactie sa blocheze tabela cu numarul de secventa sa incrementeze secventa si apoi sa elibereze resursa. In aceasta implementare, numai un singur numar de secventa poate fi generat la un moment dat. Generatorul de numere de secventa ORACLE permite generarea simultana a multiple numere de secventa de catre useri diferiti. Cind un astfel de numar este generat, secventa este incrementata indiferent de tranzactiile in desfasurare. Daca doi useri acceseaza aceeasi secventa in acelasi timp, atunci fiecare user poate sa obtina eroare deoarece numere de secventa sunt de asemenea generate de al doilea user. Doi useri nu vor genera niciodata acelasi numar de secventa utilizind aceiasi secventa. Numere de secventa pot fi "sarite" daca un user nu-si termina o tranzactie sau daca aceasta sfirseste in mod anormal. Utilizarea numerelor de secventa cu CURRVAL Pentru a accesa un numar de secventa care tocmai a fost generat (numarul de secventa curent ) se foloseste pseudo-coloana CURRVAL. CURRVAL reprezinta ultima valoare intoarsa unui program. Cind se adreseaza NEXTVAL pentru o secventa data, numarul de secventa curent este plasat in CURRVAL. NEXTVAL trebuie folosit pentru a genera numere de secventa in sesiunea curenta a unui user, inainte de a putea adresa CURRVAL. INSERT INTO DEPT_HISTORY VALUES (dept_seg.CURRVAL, 'ACCOUNTING' , `NEW YORK'); 1 record created. SQL> SELECT * FROM DEPT_HISTORY DEPTNO DNAME LOC --------------------------------------------10 ACCOUNTING NEW YORK Reguli de folosire NEXTVAL si CURRVAL NEXTVAL si CURRVAL pot fi folosite in cadrul: clauza SELECT dintr-o declaratie SELECT (exceptie la afisari) lista VALUES dintr-o declaratie INSERT clauza SET dintr-o declaratie UPDATE in afara SELECT Restrictii de folosire NEXTVAL si CURRVAL NEXTVAL si CURRVAL nu pot fi folosite: intr-o lista SELECT din VIEW impreuna cu cuvintul cheie DISTINCT cu clauzele ORDER BY, GROUP BY, CONNECT BY, sau HAVING dintr-o declaratie SELECT cu operatorii UNION, INTERSECT, MINUS Secventele sunt tratate in mod similar cu tabelele si pot fi modificate sau abandonate. Proprietarul unei secvente poate de asemenea atribui privilegii si altor useri asupra secventei. Modificarea unei Secvente Se foloseste comanda ALTER SEQUENCE pentru a modifica o secventa existenta.

AKTER SEQUENCE [user.]sequence_name [INCREMENT BY n] [MAXVALUE n | NOMAXVALUE] [MINVALUE n | NOMINVALUE] De exemplu pentru a seta o noua valoare maxima pentru secventa dept_deq, ALTER SEQUENCE dept_seq maxvalue 100000 Pentru a modifica o secventa este necesar sa fii proprietarul eu sau sa ai dreptul DBA sau sa fi primit dreptul ALTER pentru secventa din partea proprietarului. Nota: Numai secventele viitoare vor fi influentate de catre comanda ALTER SEQUENCE Valoarea START WITH nu poate fi schimbata folosind comanda ALTER SEQUENCE Secventa trebuie abandonata si recreata pentru a reporni secventa la un numar diferit. Atribuirea drepturilor asupra Secventelor Proprietarul unei secvente poate atribui altor useri drepturi de ALTER sau SELECT asupra secventei Stergerea unei Secvente Folositi comanda DROP SEQUENCE pentru a sterge o definitie de secventa. Sintaxa este: DROP SEQUENCE [user.]sequence_namel Trebuie sa fii proprietarul secventei sau sa ai dreptul de DBA pentru a o sterge. Pentru a sterge secventa dept_seq, tastati: DROP SEQUENCE sept_seq; Tiparirea Secventelor Toate definitiile secventelor sunt memorate intr-o tabela de secvente. Pentru a vedea secventele la care ai access, interogheaza baza de date urmarind USER_SEQUENCES sau ALL_SEQUENCES.

INDEXAREA
Indexarea in sistemul ORACLE are doua principale scopuri: 1. Pentru a accelera afisarea liniilor cu o cheie particulara. 2. Pentru a forta unicitatea valorilor din coloane, de obicei valorile cheii primare. Folosirea indexarii este puternic recomandata pentru a obtine performante mai bune. Retineti ca ORACLE 7 creeaza automat indecsi pentru coloanele care au setate PRIMARY KEY sau UNIQUE. Proprietarul unei tabele poate crea indecsi pentru ea. Orice user ORACLE care detine dreptul de access INDEX poate creea un index. Odata creat, ORACLE va folosi index-ul ori de cite ori este posibil pentru a accelera accesul datelor. Acest lucru se face in mod automat si deobicei nu este necesara interventia userului care poate sa nu stie de existenta acestul index. Structura unui INDEX ORACLE ORACLE foloseste arbori B pentru indexare. Timpul de access este independent de volumul de date indexat. Fiecare index construit de ORACLE contine un numar de pagini memorate in arbore. Fiecare pagina contine un numar de cheii. ORACLE gestioneaza aceasta structura la fel cum sunt inserate sau sterse linii. Valorile NULL nu sunt memorate in index, si din fericire nu ocupa spatiu.

Tipuri de INDEX TYPE DESCRIERE ------------------------------------------------------------------UNIQUE asigura ca valorile din coloanele specificate sunt unice NON UNIQUE asigura obtinerea cit mai repede a rezultatului (implicit) SINGLE COLUMN exista numai o coloana in index CONCATENATED mai mult de 16 coloane specificate in index. Crearea unui Index Index ORACLE poate fi creat in linia de comanda cu comanda CREATE INDEX. CREATE [UNIQUE] INDEX index_name ON table (column [m]...) Crearea unui INDEX pentru a imbunatati timpul de raspuns Pentru a creea un index numit I_NAME care va fi folosit pentru a imbunatati timpul de interogare , introduceti: CREATE INDEX I_ENAME ON EMP (ENAME); Crearea unui INDEX pentru a asigura unicitatea Indecsi unici sunt creati automat ca un rezultat al constantelor PRIMARY KEY sau UNIQUE in tabela. Oricum , se mai pot creea folosind comanda CREATE UNIQUE INDEX. Pentru a evita valori duplicate in coloana EMPNO, introduceti: CREATE UNIQUE INDEX I_EMPNO ON EMP (EMPNO); Index-ul urmator asigura unicitatea valorii introduse in tabela SHIPMENTS. CREATE UNIQUE INDEX ORDER ON SHIPMENTS (S_Num, P_Num); Stergerea unui INDEX Pentru a sterge definitia unui index din tabela de date , introduceti: DROP INDEX indexname; Cind este folosit un INDEX ? Folosirea unui INDEX depinde in parte de optimizatorul ORACLE in momentul executiei. ORACLE permite ambele metode de optimizare SQL, functie de un set de reguli sau functie de cost. Reguli de folosire al unui index Oracle decide cind este adecvat sa foloseasca indecsi. Oracle tine seama de coloanele indexate si de tipul indexului si decide functie de urmatoarele reguli: 1. Indexii de pe coloane trebuie adresati in clauza WHERE: Urmatoarea interogare nu foloseste un index atita timp cit clauza WHERE nu este prezenta: SELECT ENAME,JOB,SAL,COMM FROM EMP;

Urmatoarea indetogare va folosi un index pe coloana ENAME: SELECT FROM WHERE * ENAME = 'JHONES'; EMP

2. Un index nu va fi folosit daca coloana referita in clauza WHERE face parte dintr-o expresie sau functie. Exemplul urmator nu foloseste index deoarece coloana este parte a unei functii: SELECT FROM WHERE * EMP UPPER(ENAME)= 'JHONES';

In mod similar daca HIREDATE a fost indexata, aceasta interogare nu va folosi index deoarece este o expresie: SELECT * FROM EMP WHERE HIREDATE+7 = '01-JAN-84'; Utilizarea indexarii functie de cost Modulul de optimizare bazat pe costul executiei decide un plan de executie pentru o secventa SQL calculind costul cailor alternative folosind informatii statistice acumulate daca este posibil. De obicei se va decide cea mai buna cale de utilizare a unui index. Sugestii pentru INDEXARE O tabela cu mai mult de 200 linii va beneficia din indexare pentru imbunatatirea performantelor, daca mai putin de 10% din linii vor fi intoarse in cazul unei interogari. Indexati toate coloanele acolo unde sunt cerute valori unice. Daca doua sau mai multe coloane sunt utilizate in mod frecvent impreuna in clauza WHERE sau JOIN atunci creeati un index concatenat. (CONCATENATED INDEX) Evitati mai mult de trei indexi pentru o tabela. In acest caz va fi o supraincarcare in cazul unei operatii DML. (aceasta regula s-ar putea sa nu fie valabila pentru tabele la care SELECT este operatiunea cea mai frecventa, de exemplu tabele de referinte.) Exercitii 1. Interogati tabela DDT (data dictionary table) pentru a obtine informatii despre indexii folositi (USER_INDEXES). Solutii: SELECT FROM _ TABLE_NAME, INDEX_NAME USER_INDEXES;

S-ar putea să vă placă și