Sunteți pe pagina 1din 9

Vederi in SQL

O vedere este un tabel logic, fiind de asemenea organizat n rnduri i coloane. Ea preia rezultatul unei interogri i l trateaz ca pe un tabel, de unde i numele de tabel logic. De exemplu, dac din tabelul salariat se dorete vizualizarea doar a cinci coloane (cod_salariat, nume, prenume, data_nastere, cod_dept) i numai a rndurilor pentru care cod_tara = 40, se poate crea o vedere care conine numai aceste linii i coloane, vezi figura 6.1. tabel de baz salariat cod_ nume prenume salariat 101 Popescu Ion 102 Vasilescu Vasile 103 Georgescu Ilie 104 Enescu Gic 105 Georgescu Viorel vedere salariat_40 cod_ nume salariat 102 Vasilescu 104 Enescu 105 Georgescu

data_ natere 11-DEC-77 12-JAN-77 01-MAY-78 11-JUN-66 02-APR-77

salariu 5000 3000 3000 2000 2000

manager Cod_ Dept 1 101 1 101 1 102 1 104 2

cod_tara 44 40 44 40 40

prenume Vasile Gic Viorel

data_ natere 12-JAN-77 11-JUN-66 02-APR-77

cod_ dept 1 1 2

O vedere poate fi construit din una sau mai multe tabele sau chiar alte vederi i permite ca datele din mai multe tabele s fie rearanjate, reunite logic sau ca noi date s fie calculate pe baza acestora. Din punct de vedere al aplicaiei, vederile au acelai comportament ca i tabelele: vederile pot i interogate i, cu anumite excepii care vor fi menionate mai trziu, asupra vederilor se pot efectua operaii DML (INSERT, DELETE, UPDATE). Vederea este un instrument foarte puternic pentru dezvoltatorul de aplicaii. Ea poate fi bazat pe mai multe tabele sau vederi care se pot gsi pe maini diferite sau pot aparine unor utilizatori diferii, acestea fiind prezentate ca i cum ar fi un singur tabel logic. Spre deosebire de tabel, vederea nu stocheaz date i nici nu are alocat vreun spaiu de stocare; vederea doar extrage sau deriv datele din tabelele la care aceasta se refer. Aceste tabele poart numele de tabele de baz ale vederii. Acestea pot fi tabele sau pot fi ele nsele vederi. Oracle stocheaz definiia vederii n dicionarul de date sub forma textului interogrii care definete vederea, de aceea o vedere poate fi gndit ca o interogare stocat. Pentru vizualizarea definiiilor vederilor se poate folosi coloana TEXT a vederilor ALL_VIEWS, DBA_VIEW i USER_VIEW din dicionarul de date. Vederile pot fi interogate exact la fel ca tabelele, folosind comanda SELECT. Cnd o interogare SQL se refer la o vedere, Oracle combin aceast interogare cu interogarea care definete vederea.

n general, vederile sunt create pentru urmtoarele scopuri: Asigurarea unui nivel mai mare de securitate a bazei de date prin limitarea accesului la un numr mai restrns de linii i coloane ale unui tabel. Simplificarea interogrilor SQL, permind vizualizarea unor date care n mod normal necesit interogri SQL destul de complicate. De exemplu, o vedere poate permite utilizatorilor vizualizarea datelor din mai multe tabele fr ca acetia s fie obligai s foloseasc un SELECT pe mai multe tabele. Prezentarea diferit a datelor fa de cea din tabelele de baz. De exemplu, coloana unei vederi poate avea alt nume dect coloana corespunztoare din tabelul de baz, acest lucru neafectnd n nici un fel tabelul de baz. Efectuarea unor interogri care nu ar putea fi efectuate fr existena unei vederi. De exemplu, este posibil definirea unei vederi care realizeaz un join ntre o vedere care include clauza GROUP BY i un alt tabel; acest lucru nu poate fi fcut ntr-o singur interogare. Pentru a menine calcule mai complicate. Interogarea care definete vederea poate efectua calcule complicate aspra datelor dintr-un tabel; prin meninerea acestei interogri ca o vedere, calculele pot fi efectuate de fiecare dat cnd se face referire la vedere. Asigurarea transparent a datelor pentru anumii utilizatori i aplicaii. O vedere poate conine date din mai multe tabele, care pot fi proprietatea mai multor utilizatori. Crearea vederilor O vedere este creat folosind comanda SQL CREATE VIEW. De exemplu, pentru vederea de mai sus vom avea: CREATE VIEW salariat_40 AS SELECT cod_salariat, nume, prenume, salariu, cod_dept FROM salariat WHERE cod_tara = 40; O sintax simplificat a comenzii CREATE VIEW este urmtoarea: CREATE [OR REPLACE] [FORCE | NOFORCE] VIEW nume_vedere [(alias [,alias]...)] AS subinterogare [WITH READ ONLY] [WITH CHECK OPTION [CONSTRAINT nume_cosntrangere]] unde OR REPLACE recreeaz vederea dac ea exist deja. Aceast opiune poate fi folosit pentru a schimba definiia unei vederi existente fr a o distruge n prealabil. Avantajul recrerii vederii prin opiunea REPLACE este c n acest caz se pstreaz toate privilegiile acordate asupra acestei vederi. De exemplu, s presupunem c dup crearea unei vederi, au fost acordate privilegii asupra vederii pentru anumite roluri sau pentru anumii utilizatori. Dac dup aceea vederea este distrus i recreat, atunci toate privilegiile asupra vederii au fost pierdute i trebuie acordate din nou. Dac vederea este ns recreat folosind opiunea OR REPLACE, atunci privilegiile acordate sunt pstrate i nu mai este necesar acordarea lor nc o dat. FORCE este o opiune care permite crearea vederii indiferent dac tabelele de baz i coloanele la care se face referire exist sau nu, sau dac utilizatorul posed sau nu privilegiile corespunztoare n legtur cu tabelele respective. Opiunea opus, NOFORCE, creeaz vederea numai dac

tabelele de baz exist i dac utilizatorul posed privilegiile corespunztoare n legtur cu tabelele respective; NOFORCE este opiunea implicit. Dac se folosete opiunea FORCE i un tabel de baz nu exist sau una dintre coloane nu este valid, atunci Oracle va crea vederea cu erori de compilare. Dac mai trziu tabelul n cauz este creat sau coloana este corectat, atunci vederea poate fi folosit, Oracle recompilnd-o dinamic nainte de folosire. alias specific numele expresiilor selectate de interogarea vederii. Numrul alias-urilor trebuie s fie acelai cu numrul de expresii selectate de ctre interogarea vederii. Un alias trebuie s fie unic n cadrul unei interogri. Dac sunt omise alias-urile, Oracle va folosi denumirile coloanelor din interogare. Atunci cnd interogarea vederii conine i expresii, nu doar simple coloane, trebuie folosite alias-uri. AS indic interogarea vederii. Aceasta poate fi orice instruciune SELECT care nu conine clauzele ORDER BY i FOR UPDATE. opiunea WITH READ ONLY asigur c nici o operaie DML (inserare, tergere, modificare) nu va fi asigurat asupra vizualizrii. WITH CHECK OPTION este o constrngere care arat c toate actualizrile efectuate prin intermediul vederii vor afecta tabelele de baz numai dac actualizrile respective vor avea ca rezultat numai rnduri care pot fi vizualizate prin intermediul vederii. CONSTRAINT furnizeaz un nume pentru constrngerea CHECK OPTION. Asupra acestor opiuni vom reveni puin mai trziu.

Exemplul urmtor ilustreaz crearea unei vederi care conine codul, numele, prenumele, salariul i sporul salarial pentru toi salariaii din departamentul 1 i ara cu codul 40. CREATE OR REPLACE VIEW salariat_1 (cod, nume, prenume, salariu, spor_salariu) AS SELECT cod_salariat, nume, prenume, salariu, salariu*0.1 FROM salariat WHERE cod_dept = 1 AND cod_tara = 40; Dac datele din tabelul salariat sunt cele din figura 6.1, atunci vederea salariat_1 va conine urmtoarele date: salariat_1 cod nume 102 Vasilescu 104 Enescu Figura 6.2

prenume Vasile Gic

salariu 3000 3000

spor_salariu 300 300

Operaii DML asupra vederilor n momentul n care n tabelele de baz sunt adugate noi date sau sunt actualizate sau terse cele existente, aceste modificri se reflect corespunztor n vederile bazate pe aceste tabele. Acest lucru este adevrat i viceversa, cu singura meniune c exist anumite restricii la inserarea, actualizarea sau tergerea datelor dintr-o vedere. Aceste restricii sunt redate pe scurt n continuare: Nu pot fi inserate, terse sau actualizate datele din vederi care conin una dintre urmtoarele: operatorul DISTINCT (pentru eliminarea duplicatelor); clauzele GROUP BY, HAVING, START WITH, CONNECT BY; pseudo-coloana ROWNUM (aceast pseudo-coloan conine un numr ce indic ordinea n care Oracle selecteaz nregistrrile dintr-un tabel);

funciile de grup (COUNT, SUM, MAX, MIN, AVG, STDDEV, VARIANCE, GLB); operatorii de mulimi (UNION, UNION ALL, INTERSECT, MINUS). Nu pot fi inserate sau actualizate valorile coloanelor care rezult prin calcul, de exemplu coloana spor_salariu de mai sus. De asemenea nu se pot efectua operaii DML asupra valorilor coloanelor care au fost calculate folosind funcia DECODE Nu pot fi inserate sau actualizate date care ar nclca constrngerile din tabele de baz. De exemplu, daca n tabela salariat coloana nume este definit ca NOT NULL, atunci n orice vedere bazat pe acest tabel care nu conine coloana nume (de exemplu salariat_exemplu definit mai jos) nu va fi posibil inserarea de date deoarece aceasta ar duce la nclcarea constrngerii NOT NULL. CREATE VIEW salariat_exemplu AS SELECT cod_salariat, prenume, data_nastere FROM salariat; n versiunea Oracle 7 nu pot fi inserate, terse sau actualizate datele din vederi bazate pe mai multe tabele; n versiunea Oracle 8 acest lucru este posibil, ns cu anumite excepii, care vor fi discutate ntr-una dintre seciunile urmtoare. n plus fa de regulile de mai sus, la crearea unei vederi se poate utiliza clauza WITH CHECK OPTION care impune ca singurele date care pot fi inserate sau actualizate prin intermediul vederii s fie numai acelea care pot fi vizualizate de aceasta. Pentru a clarifica acest aspect, s considerm vederea salariat_2000 definit mai jos i posibilitile existente de a insera rnduri n aceast vedere. CREATE VIEW salariat_2000 AS SELECT cod_salariat, nume, prenume, data_nastere, salariu FROM salariat WHERE salariu > 2000; Prima comand SQL de mai jos va duce la inserarea unui rnd n tabela de baz salariat, care poate fi vizualizat i prin intermediul vederii salariat_2000, deoarece valoarea corespunztoare coloanei salariu este mai mare dect 2000. Pe de alt parte, a doua comand SQL va duce la inserarea unui rnd n tabelul de baz care nu poate fi ns vizualizat prin intermediul vederii. INSERT INTO salariat_2000 (cod_salariat, nume, prenume, data_nastere, salariu) VALUES (106, 'Ionescu', 'Vasile', '11-JUL-60' , 3000); INSERT INTO salariat_2000 (cod_salariat, nume, prenume, data_nastere, salariu) values (107, 'Popescu', 'Viorel', '22-JAN-69' , 1000); De exemplu, dac naintea executrii acestor comenzi n tabelul salariat exist datele din figura 6.1, atunci dup executarea acestor comenzi, datele din tabelul salariat i vederea salariat_2000 vor fi urmtoarele: tabel de baz salariat cod_ Nume prenume salariat

data_ nastere

salariu

manager cod_ dept

cod_tara

101 102 103 104 105 106 107

Popescu Vasilescu Georgescu Enescu Georgescu Ionescu Popescu

Ion Vasile Ilie Gic Viorel Vasile Viorel

11-DEC-77 12-JAN-77 01-MAY-78 11-JUN-66 02-APR-77 11-JUL-60 22-JAN-69

5000 3000 3000 2000 2000 3000 1000

101 101 102 104

1 1 1 1 2

44 40 44 40 40

vedere salariat_2000 Cod_ nume prenume Salariat 101 Popescu Ion 102 Vasilescu Vasile 103 Georgescu Ilie 106 Ionescu Vasile

data_ nastere 11-DEC-77 12-JAN-77 01-MAY-78 11-JUL-60

salariu 5000 3000 3000 3000

S presupunem acum c aceeai vedere, salariat_2000, este creat folosind clauza WITH CHECK OPTION: CREATE VIEW salariat_2000 AS SELECT cod_salariat, nume, prenume, data_nastere, salariu FROM salariat WHERE salariu > 2000 WITH CHECK OPTION; i n acest caz, inserarea n vedere a unui rnd pentru care valoarea coloanei salariu este mai mare dect 2000 se face fr probleme. Pe de alt parte ns, orice ncercare de a insera n vedere rnduri pentru care salariul este mai mic sau egal cu 2000 va produce o eroare indicnd nclcarea constrngerii WITH CHECK OPTION, comanda nemodificnd tabelul de baz. De exemplu, executarea celor dou comenzi de INSERT de mai sus va avea n acest caz ca rezultat urmtoarele date din salariat i salariat_2000. tabel de baz salariat cod_ nume prenume salariat 101 Popescu Ion 102 Vasilescu Vasile 103 Georgescu Ilie 104 Enescu Gic 105 Georgescu Viorel 106 Ionescu Vasile vedere salariat_2000 cod_ nume prenume salariat 101 Popescu Ion 102 Vasilescu Vasile 103 Georgescu Ilie 106 Ionescu Vasile

data_ nastere 11-DEC-77 12-JAN-77 01-MAY-78 11-JUN-66 02-APR-77 11-JUL-60

salariu 5000 3000 3000 2000 2000 3000

manager cod_ dept 1 101 1 101 1 102 1 104 2

cod_tara 44 40 44 40 40

data_ nastere 11-DEC-77 12-JAN-77 01-MAY-78 11-JUL-60

salariu 5000 3000 3000 3000

n cazul folosirii constrngerii CHECK OPTION, acesteia i se poate atribui un nume folosind opiunea CONSTRAINT din cadrul comenzii CREATE VIEW. De exemplu: CREATE VIEW salariat_2000 AS SELECT cod_salariat, nume, prenume, data_nastere, salariu FROM salariat WHERE salariu > 2000 WITH CHECK OPTION CONSTRAINT salariu_2000; Dac opiunea CONSTRAINT este omis, Oracle atribuie n mod automat constrngerii CHECH OPTION un nume de forma SYS_Cn unde n este un ntreg care face ca numele constrngerii s fie unic n baza de date. Operaii DML asupra vederilor bazate pe mai multe tabele (Join-Views) Aa cum am menionat mai sus, n versiunea Oracle8 este posibil inserarea, actualizarea sau tergerea datelor dintr-o vedere bazat pe mai multe tabele, cu anumite restricii ns. Alturi de restriciile generale, aplicabile tuturor vederilor, prezentate n seciunea precedent, exist i restricii specifice numai vederilor bazate pe mai multe tabele. Acestea sunt redate de urmtoarele reguli: Regula general: Orice operaie de INSERT, UPDATE sau DELETE pe o vedere bazat pe mai multe vederi poate modifica datele din doar unul dintre tabelele de baz. nainte de a enuna regulile specifice pentru fiecare dintre operaiile INSERT, UPDATE sau DELETE este necesar definirea conceptului de tabel protejat de cheie (key-preserved table). Dat fiind o vedere bazat pe mai multe tabele, un tabel de baz al vederii este protejat prin cheie dac orice cheie selectat a tabelului este de asemenea i cheie a vederii. Deci, un tabel protejat prin cheie este un tabel ale crui chei se pstreaz i la nivel de vedere. Trebuie reinut c, pentru a fi protejat prin cheie, nu este necesar ca un tabel s aib toate cheile selectate n vedere. Este suficient ca, atunci cnd cheia tabelului este selectat, aceasta s fie i cheie a vederii. Proprietatea unui tabel de a fi protejat prin cheie nu este o proprietate a datelor din tabel, ci o proprietate a schemei. n exemplul de mai jos, dac pentru fiecare combinaie (cod_tara, cod_dept) ar exista un singur salariat, atunci combinaia (cod_tara, cod_dept) din tabelul departament ar fi unic pentru datele din vederea rezultat, dar tabelul departament tot nu ar fi protejat prin cheie. Pentru a ilustra aceast noiune ct i regulile urmtoare, s considerm o definiie simplificat a tabelelor departament i salariat n care pstrm doar constrngerile de cheie primar i integritate referenial. CREATE TABLE departament( cod_dept NUMBER(10), cod_tara NUMBER(10), nume_dept VARCHAR2(10), PRIMARY KEY(cod_dept, cod_tara)); CREATE TABLE salariat( cod_salariat NUMBER(10) nume VARCHAR2(10), prenume VARCHAR2(10), data_nastere DATE, PRIMARY KEY,

manager NUMBER(10) salariat(cod_salariat), salariu NUMBER(10), cod_dept NUMBER(10), cod_tara NUMBER(10), FOREIGN KEY(cod_dept, cod_tara) cod_tara));

REFERENCES

REFERENCES

departament(cod_dept,

S mai considerm i urmtoarea vedere bazat pe aceste dou tabele: CREATE VIEW sal_dept (cod_salariat, nume, prenume, salariu, cod_dept, nume_dept) AS SELECT s.cod_salariat, s.nume, s.prenume, s.cod_dept, s.cod_tara, d.nume_dept FROM salariat s, departament d WHERE s.cod_dept = d.cod_dept AND s.cod_tara = d.cod_tara; cod_tara, s.salariu,

n exemplul de mai sus, tabelul salariat este protejat prin cheie. Regulile specifice pentru fiecare dintre operaiile DML (INSERT, UPDATE sau DELETE) sunt redate n continuare: Reguli de actualizare (UPDATE): Toate coloanele care pot fi actualizate printr-o vedere trebuie s corespund coloanelor dintr-un tabel protejat prin cheie. Dac o coloan provine dintr-o tabel neprotejat prin cheie, atunci Oracle nu va putea identifica n mod unic nregistrarea care va trebui actualizat. De exemplu, comanda SQL de mai jos se va executa cu succes. UPDATE sal_dept SET salariu = salariu + 100 WHERE cod_tara = 40; Pe de alt parte, comanda urmtoare va eua: UPDATE sal_dept SET nume_dept = IT WHERE cod_dept = 1 AND cod_tara = 40; Comanda de mai sus va eua pentru c ea ncearc s actualizeze o coloan din tabelul departament, tabel care nu este protejat prin cheie. Dac vederea este definit folosind clauza WITH CHECK OPTION, atunci toate coloanele de jonciune i toate coloanele tabelelor repetate nu pot fi modificate. De exemplu, dac vederea sal_dept ar fi fost definit folosind clauza WITH CHECK OPTION, atunci comanda urmtoare va eua deoarece ncearc modificarea unei coloane de jonciune. UPDATE sal_dept SET cod_dept = 2 WHERE cod_salariat = 101 AND cod_tara = 40; Reguli de inserare (INSERT):

O comand INSERT nu poate s se refere n mod explicit sau implicit la coloane dintr-un tabel care nu este protejat prin cheie. De exemplu, dac n tabelul departament exist o linie cu cod_dept = 3 i cod_tara = 40, atunci urmtoarea comand SQL va fi executat cu succes: INSERT INTO sal_dept (cod_salariat, nume, cod_dept, cod_tara) VALUES(110, Marinescu, 3, 40); n caz contrar, comanda va eua, fiind nclcat constrngerea de integritate referenial. Pe de alt parte, comanda urmtoare va eua deoarece ea ncearc inserarea de date n mai multe tabele. INSERT INTO sal_dept (cod_salariat, nume, nume_dept) VALUES(111, Georgescu, IT); Dac o vedere este definit folosind clauza WITH CHECK OPTION, atunci nu se pot executa comenzi INSERT n acea vedere. Reguli de tergere (DELETE) Rndurile dintr-o vedere pot fi terse numai dac n jonciune exist un tabel protejat prin cheie i numai unul. Dac ar exista mai multe tabele, Oracle nu ar ti din care tabel s tearg rndul. De exemplu, comanda SQL de mai jos se va executa cu succes deoarece ea poate fi tradus ntr-o operaie de tergere pe tabelul salariat: DELETE FROM sal_dept WHERE nume = Popescu; Pe de alt parte, dac se ncearc executarea unei comenzi DELETE pe vederea de mai jos, ea va eua deoarece ambele tabele de baz, s1 i s2, sunt protejate prin cheie: CREATE VIEW emp_emp AS SELECT s1.nume, s2.prenume FROM salariat s1, salariat s2 WHERE s1.cod_salariat = s2.cod_salariat; Dac vederea este definit folosind clauza WITH CHECK OPTION, atunci nu pot fi terse rnduri din vedere. De exemplu, nu se poate executa o instruciune DELETE pe vederea de mai jos deoarece ea este definit ca auto-jonciune a unui tabel protejat prin cheie. CREATE VIEW emp_manag AS SELECT s1.nume, s2.nume nume_manager FROM salariat s1, salariat s2 WHERE s1.manager = s2.cod_salariat WITH CHECK OPTION; Vederile ALL_UPDATABLE_COLUMNS, DBA_UPDATABLE_COLUMNS i USER_UPDATABLE_COLUMNS ale dicionarului de date conin informaii care arat care dintre coloanele vederilor existente pot fi actualizate. Vederile care nu pot fi actualizate direct pot fi actualizate folosind triggere INSTEAD OF, vezi seciunea 9.16.

Recompilarea vederilor Recompilarea unei vederi permite detectarea eventualelor erori referitoare la vederea respectiv naintea executrii vederii. Dup fiecare modificare a tabelelor de baz este recomandabil ca vederea s se recompileze. Acest lucru se poate face folosind comanda SQL alter view ... compile: alter view salariat_2000 compile; Distrugerea vederilor Pentru distrugerea unei vederi se folosete comanda drop view: drop view salariat_2000; Utilizarea unei vederi este cteodat o sabie cu dou tiuri. Dei vederile constituie un instrument extrem de convenabil pentru dezvoltatorul de aplicaii, ele pot avea un impact negativ asupra performanei acestora. Dac pentru vederi simple (de exemplu simple copii ale unui tabel) impactul asupra performantei nu este sesizabil, pentru vederi complexe, care cuprind interogri pe mai multe tabele, acest impact poate fi foarte sever. De aceea folosirea vederilor trebuie planificat cu grija, pentru a se vedea dac avantajul creat de simplitatea n manipulare a acestora compenseaz impactul negativ asupra performanei.

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