Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Vizualizari

sql



+ Font mai mare | - Font mai mic



Vizualizari

Vizualizarea (view) este un tabel logic (virtual) relativ la date din una sau mai multe tabele sau vizualizari. Vizualizarea este definita plecand de la o cerere a limbajului de interogare a datelor, mostenind caracteristicile obiectelor la care se refera. Vizualizarea, fiind virtuala, nu solicita o alocare de memorie pentru date. Ea este definita in DD cu aceleasi caracteristici ca si un tabel.



Textul cererii care defineste vizualizarea este salvat in DD. Nucleul Oracle determina fuzionarea cererii relative la vizualizare cu comanda de definire a vizualizarii, analizeaza rezultatul fuziunii in zona partajata si executa cererea.

è Oracle transforma cererea referitoare la o vizualizare intr-o cerere relativa la tabelele de baza. Vizualizarea este memorata in DD sub forma unui SELECT.

Daca sunt utilizate clauzele UNION, GROUP BY si CONNECT BY, atunci Oracle nu determina fuzionarea, el va rezolva vizualizarea si apoi va aplica cererea rezultatului obtinut.

O vizualizare reflecta la orice moment continutul exact al tabelelor de baza. Orice modificare efectuata asupra tabelelor se repercuteaza instantaneu asupra vizualizarii. Stergerea unui tabel implica invalidarea vizualizarilor asociate tabelului si nu stergerea acestora.

Vizualizarile sunt definite pentru:

furnizarea unui nivel mai inalt de securizare a bazei;

simplificarea formularii unei cereri;

mascarea complexitatii datelor;

afisarea datelor intr-o alta reprezentare decat cea a tabelelor de baza;

asigurarea independentei datelor;

asigurarea confidentialitatii anumitor informatii;

definirea constrangerilor de integritate;

restrictionarea acesului la date.

Vizualizarile pot fi simple si complexe. O vizualizare simpla extrage date dintr-un singur tabel, nu contine functii sau grupari de date si asupra ei pot fi efectuate operatii LMD.

O vizualizare este considerata complexa daca extrage date din mai multe tabele, contine functii sau grupari de date si nu permite intotdeauna (prin intermediul sau) operatii LMD asupra tabelelor de baza.

Operatiile LMD asupra vizualizarilor complexe sunt restrictionate de urmatoarele reguli:

nu se poate insera, actualiza sau sterge o linie dintr-o vizualizare daca aceasta contine functii grup, clauza GROUP BY, cuvantul cheie DISTINCT sau pseudocoloana ROWNUM;

nu se poate adauga sau modifica o linie dintr-o vizualizare, daca aceasta contine coloane definite prin expresii;

nu pot fi adaugate linii printr-o vizualizare, daca tabelul de baza contine coloane care au constrangerea NOT NULL si nu apar in lista SELECT a vizualizarii.

Pentru a obtine informatii referitoare la vizualizarile definite, se pot interoga vizualizarile USER_VIEWS si ALL_VIEWS din dictionarul datelor. Textul instructiunii SELECT care defineste o vizualizare este stocat intr-o coloana de tip LONG, numita TEXT.

Atunci cand datele sunt accesate prin intermediul unei vizualizari, server-ul Oracle efectueaza urmatoarele operatii:

recupereaza definitia acesteia din USER_VIEWS;

verifica privilegiile de acces la tabelele ei de baza;

converteste cererea intr-o operatie echivalenta asupra tabelelor de baza.

Crearea unei vizualizari se realizeaza cu ajutorul comenzii:

CREATE [OR REPLACE][FORCE | NOFORCE] VIEW

[<nume_schema>.]<nume_view> [(<alias>[,<alias>].)]

    AS <cerere_SELECT>

[WITH ];

OR REPLACE recreeaza vizualizarea daca aceasta deja exista.

FORCE creeaza vizualizarea chiar daca tabelul de baza nu exista sau chiar daca vizualizarea face referinta la obiecte care inca nu sunt create. Desi vizualizarea va fi creata, utilizatorul nu poate sa o foloseasca.

NO FORCE este implicita si se refera la faptul ca vizualizarea este creata numai daca tabelele de baza exista.

Cererea este o comanda SELECT care poate sa contina alias pentru coloane.

WITH CHECK OPTION specifica faptul ca reactualizarea datelor din tabele (inserare sau modificare) se poate face numai asupra datelor selectate de vizualizare (care apar in clauza WHERE).

WITH READ ONLY asigura ca nici o operatie LMD nu poate fi executata asupra vizualizarii.

Exemplu

Sa se genereze o vizualizare care contine informatii referitoare la imprumutul cartilor si in care sa fie implementata constringerea ca orice carte, care exista intr-un singur exemplar, poate fi imprumutata maximum 15 zile.

CREATE VIEW imprumutare

AS SELECT *

FROM  imprumuta

WHERE codel NOT IN

(SELECT codel

FROM carte

WHERE nrex = 1)

OR datares - dataim < 15

WITH CHECK OPTION;

Cererea care defineste vizualizarea poate fi complexa, incluzand join-uri, grupari si subcereri, insa nu poate contine clauza ORDER BY. Daca este necesar, aceasta clauza poate fi specificata la interogarea vizualizarii. Interogarea unei vizualizari este similara celei unui tabel. Numarul coloanelor specificate in definitia vizualizarii trebuie sa fie egal cu cel din lista asociata comenzii SELECT.

Asupra cererii care defineste vizualizarea se impun urmatoarele restrictii:

nu pot fi selectate pseudocoloanele CURRVAL si NEXTVAL ale unei secvente;

daca sunt selectate pseudocoloanele ROWID, ROWNUM sau LEVEL, acestora trebuie sa li se specifice alias-uri;

daca cererea selecteaza toate coloanele unui tabel, utilizand simbolul "*", iar ulterior se adauga coloane noi tabelului, vizualizarea nu va contine acele coloane pana la recrearea sa printr-o instructiune CREATE OR REPLACE VIEW;

pentru vizualizarile obiect, numarul si tipul elementelor selectate de cerere trebuie sa coincida cu cel al atributelor de pe primul nivel al tipului obiect.

Aportul versiunii Oracle9i in ceea ce priveste instructiunea CREATE VIEW consta in posibilitatea:

crearii de subvizualizari ale vizualizarilor obiect;

definirii de constrangeri asupra vizualizarilor.

Exemplu

a)      Sa se creeze o vizualizare care contine numele si prenumele artistului, numarul operelor sale si valoarea medie a acestora.

CREATE VIEW artist_nr_val(nume, numar_opere, val_medie)

AS SELECT a.nume || ' ' || a .prenume 'Nume si prenume',

COUNT(o. cod_opera) numar, AVG(o.valoare) medie

FROM opera o, artist a

WHERE o.cod_artist = a.cod_artist

GROUP BY o.cod_artist, a.nume, a.prenume;

b)      Sa se creeze vizualizarea sculptura ce va contine codul operei, data achizitiei, codul artistului si stilul operelor al caror tip este "sculptura".

CREATE OR REPLACE VIEW sculptura

(cod_sculptura, informatii, cod_sculptor, stil)

AS SELECT cod_opera,

'Sculptura ' || titlu ||

' a fost achizitionata la data ' ||

data_achizitiei, cod_artist, stil

FROM opera

WHERE tip = 'sculptura';

Modificarea unei vizualizari presupune modificarea definitiei acesteia. Pentru a inlocui o vizualizare trebuie avut privilegiul de sistem necesar pentru distrugerea si crearea acesteia. Inlocuirea se poate face in doua moduri.

Vizualizarea poate fi distrusa (DROP VIEW) si apoi recreata (CREATE) cu noua definitie. Atunci cand este distrusa, toate privilegiile sunt retrase. Aceste privilegii trebuie sa fie create pentru noua vizualizare.

Vizualizarea poate fi recreata prin redefinire cu instructiunea CREATE VIEW, dar cu clauza OR REPLACE. Aceasta metoda conserva toate privilegiile curente.

In Oracle9i este posibila adaugarea de constrangeri unei vizualizari prin comanda ALTER VIEW.

Modificarea unui vizualizari are urmatoarele efecte:

definitia vizualizarii din DD este actualizata;

nici unul din obiectele de baza nu este afectat de inlocuire;

toate restrictiile care existau in vizualizarea originala sunt distruse;

toate vizualizarile si programele PL/SQL dependente de vizualizarea inlocuita devin invalide.

Suprimarea unei vizualizari se realizeaza prin comanda DROP VIEW care sterge definitia vizualizarii din baza de date.

DROP VIEW <nume_view> CASCADE CONSTRAINT

Stergerea vizualizarii nu va afecta tabelele relativ la care a fost definita vizualizarea. Aplicatiile si vizualizarile care se bazeaza pe vizualizarea suprimata devin invalide. Pentru a suprima o vizualizare, utilizatorul trebuie sa aiba privilegiul DROP ANY VIEW sau sa fie creatorul vizualizarii respective.

Similar optiunii corespunzatoare din comanda DROP TABLE, clauza CASCADE CONSTRAINTS permite suprimarea tuturor constrangerilor de integritate referentiala corespunzatoare cheilor primare si unice din vizualizarea supusa stergerii. Daca se omite aceasta clauza si exista astfel de constrangeri, instructiunea DROP VIEW va esua.

Recompilarea unei vizualizari permite detectarea eventualelor erori referitoare la vizualizare, inaintea executarii vizualizarii. Dupa fiecare modificare a tabelelor de baza este recomandabil ca vizualizarea sa se recompileze:

ALTER VIEW <nume_view> COMPILE

Reactualizarea tabelelor implica reactualizarea corespunzatoare a vizualizarilor!!!

Reactualizarea vizualizarilor implica reactualizarea tabelelor de baza? NU! Exista restrictii care trebuie respectate!!!

Nu pot fi modificate date din vizualizare sau adaugate date prin vizualizare, daca aceasta contine coloane definite prin expresii.

Nu pot fi inserate, sterse sau actualizate date din vizualizari ce contin: operatorul DISTINCT; clauzele GROUP BY, HAVING, START WITH, CONNECT BY; pseudo-coloana ROWNUM; functii grup; operatori de multimi.

Nu pot fi inserate sau actualizate date care ar incalca constrangerile din tabelele de baza.

Nu pot fi inserate sau actualizate valorile coloanelor care rezulta prin calcul.

Nu se pot face operatii LMD asupra coloanelor calculate cu DECODE.

Alaturi de restrictiile prezentate anterior, aplicabile tuturor vizualizarilor, exista restrictii specifice, aplicabile vizualizarilor bazate pe mai multe tabele.

Regula fundamentala este ca orice operatie INSERT, UPDATE sau DELETE pe o vizualizare bazata pe mai multe tabele poate modifica datele doar din unul din tabelele de baza. In care???

Un tabel de baza al unei vizualizari este protejat prin cheie (key preserved table) daca orice cheie selectata a tabelului este de asemenea si cheie a vizualizarii. Deci, un tabel protejat prin cheie este un tabel ale carui chei se pastreaza si la nivel de vizualizare. Pentru ca un tabel sa fie protejat prin cheie nu este necesar ca tabelul sa aiba toate cheile selectate in vizualizare. Este suficient ca, atunci cand cheia tabelului este selectata, aceasta sa fie si cheie a vizualizarii.

Asupra unui join view pot fi aplicate instructiunile INSERT, UPDATE sau DELETE, doar daca sunt indeplinite urmatoarele conditii:

instructiunea LMD afecteaza numai unul dintre tabelele de baza;

in cazul instructiunii UPDATE, toate coloanele care pot fi reactualizate trebuie sa corespunda coloanelor dintr-un tabel protejat prin cheie (in caz contrar, Oracle nu va putea identifica unic inregistrarea care trebuie reactualizata);

in cazul instructiunii DELETE, randurile unei vizualizari pot fi sterse numai daca exista un tabel in join protejat prin cheie si numai unul (in caz contrar, Oracle nu ar sti din care tabel sa stearga);

in cazul instructiunii INSERT, toate coloanele in care sunt inserate valori trebuie sa provina dintr-un tabel protejat prin cheie.

ALL_UPDATABLE_COLUMNS, DBA_UPDATABLE_COLUMNS si USER_UPDATABLE_COLUMNS sunt vizualizari din DD ce contin informatii referitoare la coloanele vizualizarilor existente, care pot fi reactualizate.

Exmplu

Sa se creeze un view ce contine campurile nume, prenume, job din tabelul salariat.

Sa se insereze, sa se actualizeze si sa se stearga o inregistrare in acest view. Ce efect vor avea aceste actiuni asupra tabelului de baza?

CREATE VIEW  vederea2

AS SELECT  nume, prenume, job

FROM salariat;

Nu se pot face inserari deoarece view-ul nu contine cheia primara!

INSERT INTO  vederea2

VALUES ('Popescu','Valentin','grafician');

va genera eroarea:

ORA-01400: cannot insert NULL into

    ('SCOTT'.'SALARIAT'.'COD_SALARIAT')

Actualizarea job-ului salariatului avand numele 'Popescu':

UPDATE vederea2

SET  job = 'programator'

WHERE  nume = 'Popescu';

SELECT  nume, prenume, job FROM salariat;

Stergerea inregistrarii referitoare la salariatul avand numele 'Popescu':

DELETE  vederea2

WHERE  nume = 'Popescu';

Operatiile care se realizeaza asupra view-ului se realizeaza si in tabelul salariat. Pentru un caz mai general, cand view-ul contine cheia externa a tabelului de baza, sunt permise modificari ale view-ului, daca acestea nu afecteaza cheia externa.

Exemplu

Sa se creeze un view care contine campurile nume, prenume, job din tabelul salariat. Sa se introduca in view doar persoanele care sunt graficieni.

CREATE VIEW vederea21

AS SELECT nume, prenume, job

FROM  salariat

WHERE  job = 'grafician'

WITH CHECK OPTION;

Sa se creeze o vizualizare care sa contina cod_salariat, nume, prenume din tabelul salariat si coloana tip din tabelul grafician. Apoi sa se insereze, sa se actualizeze si sa se stearga o inregistrare din acest view (vizualizarea contine cheia primara cod_salariat din tabelele salariat si grafician).

CREATE VIEW  vederea4

AS SELECT s.cod_salariat,nume,prenume,tip

FROM salariat s, grafician g

WHERE s.cod_salariat=g.cod_salariat;

In cazul inserarii unei inregistrari pentru care se specifica toate campurile

INSERT INTO vederea4

VALUES (30,'Popescu','Valentin','artist plastic');

va apare urmatoarea eroare:

ORA-01776: cannot modify more than one base TABLE through a join view

Pot fi inserate date doar intr-un tabel de baza (in oricare, dar in unul singur) prin intermediul view-ului, astfel:

INSERT INTO  vederea4 (cod salariat, nume)

VALUES  (30, 'Popescu');

Comanda pentru stergerea unei inregistrari:

DELETE  vederea4

WHERE  cod_salariat = 3;

va genera urmatoarea eroare:

ORA-01752: cannot delete from view without exactly one key-preserved TABLE.

Modificarea unei inregistrari se face prin secventa care urmeaza. Toate actualizarile care se fac in view se fac si in tabelele de baza.

UPDATE vederea4

SET  tip = 'designer'

WHERE  cod_salariat = 3;

Exemplu

Care dintre coloanele unei vizualizari sunt actualizabile?

SELECT column_name, updatable

FROM user_updatable_columns

WHERE table_name = 'vederea4';

Exemplu

Sa se creeze un view (vederea3) care sa contina, pentru fiecare categorie de salariat, salariile medii si numarul de angajati din tabelul salariat.

Sa se insereze, sa se actualizeze si sa se stearga o inregistrare in view.

CREATE VIEW  vederea3 (nr, job, salmed)

AS SELECT COUNT(*), job, AVG(salariu)

FROM salariat

GROUP BY job;

Nu se pot face inserari, actualizari sau stergeri intr-un view ce contine functii grup. Dupa oricare din aceste operatii apare acelasi mesaj:

ORA-01732: data manipulation operation not legal on this view

Exemplu

Sa se creeze o vizualizare care sa contina coloanele cod_contractant, adresa, telefon din tabelul contractant si coloanele nr_contract, tip_contract, data_incheiere din tabelul contract. Sa se insereze o inregistrare in vizualizare.

CREATE VIEW  vederea44

AS SELECT c.cod_contractant, adresa, telefon,

co.nr_contract, tip_contract,

data_incheiere

FROM contractant c, contract co

WHERE c.cod_contractant=co.cod_contractant;

La inserarea unei inregistrari careia i se specifica valorile tuturor campurilor din ambele tabele:

INSERT INTO vederea44(cod_contractant, adresa,

          nr_contract, data_incheiere)

VALUES (200, 'Str. Marmurei, 14', '6235',

TO_DATE('January 03,2002','Month dd,yyyy'));

se obtine eroarea:

ORA-01779: cannot modify a column which maps to a non key-preserved TABLE

Cele doua tabele de baza, contractant si contract, se afla intr-o relatie "one-to-many", iar view-ul creat contine cheile primare din ambele tabele.

Doar tabelul contract este protejat prin cheie si, prin urmare, doar el poate fi modificat prin intermediul view-ului. Aceasta, deoarece ar putea exista mai multe inregistrari in view, cu aceeasi valoare corespunzatoare campului cod_contractant (CP in contractant).

Exact aceeasi eroare se obtine daca incercam inserarea unei inregistrari in vederea44, specificand fie si numai un camp provenind din tabela contractant (indiferent daca el contine sau nu CP).

Singura operatie de inserare permisa este aceea efectuata prin specificarea cheilor provenind doar din tabelul contract. Astfel, prin executarea comenzii:

INSERT INTO  vederea44(nr_contract, tip_contract)

VALUES       ('6234', 0);

este creata o inregistrare, dar este modificat si tabelul contract. Daca la insertie nu se specifica cheia primara din contract:

INSERT INTO  vederea44(tip_contract)

VALUES       (1);

ORA-01400: mandatory (NOT NULL) column is missing or NULL during insert

Cererea din definitia vizualizarii poate fi restrictionata prin clauzele WITH READ ONLY si WITH CHECK OPTION. Optiunea WITH READ ONLY asigura ca nu pot fi efectuate operatii LMD asupra vizualizarii. Constrangerea WITH CHECK OPTION garanteaza faptul ca va fi permisa, prin intermediul vizualizarii, numai inserarea sau actualizarea de linii accesibile acesteia (care sunt selectate de cerere). Prin urmare, aceasta optiune asigura constrangeri de integritate si verificari asupra validitatii datelor inserate sau actualizate.

Optiunea WITH CHECK OPTION nu poate functiona daca:

exista o cerere imbricata in cadrul subcererii vizualizarii sau in vreuna dintre vizualizarile de baza;

operatiile de inserare, stergere si modificare se fac prin intermediul declansatorilor INSTEAD OF.

Cuvantul cheie CONSTRAINT permite numirea constrangerii WITH CHECK OPTION. In absenta acestei clauze, constrangerea va avea un nume implicit de forma SYS_Cn, unde n este un numar intreg unic.

Exemplu

Sa se creeze o vizualizare ce contine artistii de nationalitate romana, care au opere expuse in muzeu. Definitia vizualizarii nu va permite modificarea nationalitatii unui artist sau inserarea unui artist avand alta nationalitate decat cea romana.

CREATE VIEW artist_roman

AS SELECT  * FROM artist

WHERE nationalitate = 'romana'

WITH CHECK OPTION CONSTRAINT artist_roman_ck;

UPDATE artist_roman

SET nationalitate = 'engleza'

WHERE cod_artist = 25;

Incercarea de actualizare a unei linii prin instructiunea anterioara va genera eroarea "ORA-01402: view WITH CHECK OPTION where-clause violation".

Exemplu

Sa se creeze o vizualizare asupra tabelului galerie care sa nu permita efectuarea nici unei operatii LMD.

CREATE VIEW viz_galerie

AS SELECT  cod_galerie, nume_galerie

FROM galerie

WITH READ ONLY;

DELETE FROM viz_galerie

WHERE cod_galerie = 10;

Incercarea de stergere a unei linii din vizualizarea viz_galerie determina aparitia erorii "ORA-01752: cannot delete from view without exactly one key-preserved table". Daca se incearca modificarea sau inserarea unei linii prin intermediul unei vizualizari asupra careia a fost definita o constrangere WITH READ ONLY, server-ul Oracle genereaza eroarea "ORA-01733: virtual column not allowed here".

Exemplu

Sa se creeze o vizualizare care contine codul si titlul operelor de arta, codul si numele artistilor care le-au creat, precum si codul galeriilor unde sunt expuse. Sa se afle daca este posibila adaugarea unei noi inregistrari prin intermediul acestei vizualizari.

CREATE VIEW opera_artist

AS SELECT o.cod_opera, o.titlu, o.cod_galerie,

a.cod_artist, a.nume

FROM opera o, artist a

WHERE o.cod_artist = a.cod_artist;

Instructiunea urmatoare afiseaza numele coloanelor si valorile YES/NO, dupa cum aceste coloane sunt, sau nu, modificabile.

SELECT COLUMN_NAME, UPDATABLE

FROM USER_UPDATABLE_COLUMNS

WHERE TABLE_NAME = 'OPERA_ARTIST';

Se va obtine ca doar primele trei coloane ale vizualizarii sunt modificabile.

Indexul primar al coloanei cod_artist din tabelul artist nu este unic in vizualizarea opera_artist. Prin urmare, tabelul artist nu este key-preserved, iar coloanele sale nu sunt modificabile.

Instructiunea urmatoare va genera eroarea "ORA-01776: cannot modify more than one base table through a join view".

INSERT INTO opera_artist
VALUES (200, 'Poeme de l''ame', 20, 147, 'Janmot');

In schimb, instructiunea urmatoare va fi executata cu succes, intrucat adauga o inregistrare in tabelul de baza opera, ale carui coloane sunt modificabile.

INSERT INTO opera_artist (cod_opera, titlu, cod_galerie)

VALUES (200, 'Poeme de l''ame', 20);

Constrangeri asupra vizualizarilor

Incepand cu versiunea Oracle9i pot fi specificate constrangeri pentru vizualizari. Se pot defini constrangeri la nivel de vizualizare, respectiv la nivel de coloana sau atribut. Constrangerile asupra vizualizarilor constituie o submultime a constrangerilor specifice tabelelor.

Pot fi specificate explicit numai constrangerile UNIQUE, PRIMARY KEY si FOREIGN KEY. Constrangerea de tip CHECK poate fi realizata prin precizarea clauzei WITH CHECK OPTION in comanda care defineste vizualizarea.

Constrangerile asupra vizualizarilor pot fi definite numai in modul DISABLE NOVALIDATE. Aceste cuvinte cheie trebuie specificate la declararea constrangerii, nefiind permisa precizarea altor stari.

Exemplu

Sa se creeze o vizualizare care contine codurile, numele si adresele galeriilor. Se va impune unicitatea valorilor coloanei adresa si constrangerea de cheie primara pentru coloana corespunzatoare codului galeriei.

CREATE VIEW viz_galerie(

cod_gal, nume, adresa UNIQUE DISABLE NOVALIDATE,

CONSTRAINT cp_viz PRIMARY KEY (cod_gal) DISABLE NOVALIDATE)

AS SELECT cod_galerie, nume_galerie, adresa

FROM galerie;

Definirea vizualizarilor materializate

O vizualizare materializata, cunoscuta in versiunile anterioare sub numele de cliseu (snapshot), este un obiect al schemei ce stocheaza rezultatele unei cereri si care este folosit pentru a rezuma, calcula, replica si distribui date.

Clauza FROM a cererii poate referi tabele, vizualizari sau alte vizualizari materializate. Luate in ansamblu, aceste obiecte sunt referite prin tabele master (in temeni de replicare) sau prin tabele detaliu (in termeni de data warehouse).

Optimizorul pe baza de costuri poate utiliza vizualizarile materializate pentru a imbunatati executia cererilor. Acesta recunoaste automat situatiile in care o astfel de vizualizare poate si trebuie sa fie utilizata pentru rezolvarea unei cereri. In urma unui asemenea demers, optimizorul rescrie cererea utilizand vizualizarea materializata.

In data warehouse, vizualizarile materializate sunt utile pentru a calcula si stoca date agregat, precum totaluri sau medii aritmetice. De asemenea, acest tip de vizualizare este utilizat pentru a efectua cereri in care intervin operatii de compunere si in care pot aparea agregari.

In mediile distribuite, vizualizarile materializate sunt utilizate pentru replicarea datelor la site-uri distribuite si sincronizarea modificarilor efectuate pe diferite site-uri. Astfel, vizualizarile materializate permit accesul local la date care, altfel, ar fi trebuit sa fie accesate de la locatii distante.

Din anumite puncte de vedere, vizualizarile materializate sunt similare indecsilor:

consuma spatiu de stocare;

trebuie reactualizate daca datele din tabelele de baza sunt modificate;

imbunatatesc performanta executiei instructiunilor SQL daca sunt folosite pentru rescrierea cererilor;

sunt transparente aplicatiilor SQL si utilizatorilor.

Spre deosebire de indecsi, vizualizarile materializate pot fi accesate utilizand instructiuni SELECT si pot fi actualizate prin instructiunile INSERT, UPDATE, DELETE.

Asupra unei vizualizari materializate se pot defini unul sau mai multi indecsi. O vizualizare materializata poate fi partitionata. De asemenea, se pot defini vizualizari materializate asupra unui tabel partitionat.

Similar vizualizarilor obisnuite, asupra celor materializate se pot defini constrangerile PRIMARY KEY, UNIQUE si FOREIGN KEY. Singura stare valida a unei constrangeri este DISABLE NOVALIDATE.

Pentru compatibilitate cu versiunile anterioare, cuvintele cheie SNAPSHOT si MATERIALIZED VIEW sunt echivalente.

CREATE MATERIALIZED VIEW [schema.]nume_viz_materializata
[OF [schema.]tip_obiect] [ (constr_ref_domeniu) ]
[ORGANIZATION INDEX clauza_tabel_org_index]
[ REDUCED PRECISION] } ]

[ ] .]
| USING NO INDEX} ]
[refresh_vm] [FOR UPDATE]
[ QUERY REWRITE] AS subcerere;

Clauza OF permite crearea unei vizualizari materializate obiect.

Sintaxa clauzei constr_ref_domeniu este urmatoarea:

SCOPE FOR
IS [schema.]nume_tabel_scope
[, SCOPE FOR ( )
IS [schema.]nume_tabel_scope] .

Clauza poate fi utilizata pentru restrictionarea domeniului referintelor la tabelul nume_tabel_scope. Valorile dintr-o coloana de tip REF vor adresa obiecte din tabelul identificat prin nume_tabel_scope. In acest tabel sunt stocate instante de obiecte care au acelasi tip ca si coloana REF.

Optiunea ON PREBUILT TABLE permite considerarea unui tabel existent ca fiind o vizualizare materializata predefinita. Tabelul trebuie sa aiba acelasi nume si sa se afle in aceeasi schema ca vizualizarea materializata rezultata. La stergerea acestei vizualizari, tabelul revine la statutul sau initial. Pentru o vizualizare materializata de acest tip, alias-urile de coloana din clauza subcerere trebuie sa corespunda, ca numar si tip de date, coloanelor din tabel.

Clauza WITH REDUCED PRECISION permite ca precizia coloanelor tabelului sau vizualizarii materializate sa nu coincida cu precizia coloanelor returnate de subcerere. Pentru a impune respectarea intocmai a preciziei, sintaxa dispune de optiunea WITHOUT REDUCED PRECISION, care este implicita.

Atributele fizice au o semantica asemanatoare celei descrise de clauza_proprietati_fizice din cadrul comenzii CREATE TABLE. Spre deosebire de tabele, pentru o vizualizare materializata nu poate fi specificata optiunea ORGANIZATION EXTERNAL.

Clauza TABLESPACE specifica spatiul tabel in care urmeaza sa fie creata vizualizarea materializata. In absenta acesteia, vizualizarea va fi creata in spatiul tabel implicit al schemei care o contine.

Clauza USING INDEX permite stabilirea de valori ale parametrilor INITRANS, MAXTRANS si STORAGE ai indexului implicit care este utilizat de sistemul Oracle pentru a intretine datele vizualizarii materializate. Daca este omisa clauza, sistemul va utiliza indexul implicit pentru ameliorarea vitezei de reactualizare incrementala a vizualizarii materializate.

Clauza proprietati_vm este utila pentru descrierea vizualizarilor materializate care nu se bazeaza pe un tabel existent (nu sunt construite cu optiunea ON PREBUILT TABLE).

Dintre proprietatile care pot fi specificate in aceasta clauza, se mentioneaza: clauza_partitionare_tabel, CACHE sau NOCACHE, clauza_paralelism. Pe langa acestea, poate fi mentionata optiunea BUILD IMMEDIATE | DEFERRED care determina introducerea de linii in vizualizarea materializata imediat, respectiv la prima operatie de reactualizare (refresh). In acest ultim caz, pana la prima operatie de reactualizare, vizualizarea nu va putea fi utilizata in rescrierea cererilor. Optiunea IMMEDIATE este implicita.

Prin refresh_vm se specifica metodele, modurile si momentele la care sistemul va reactualiza vizualizarea materializata.

] [ON ]

[START WITH data] [NEXT data]

[ WITH ]

| USING

] ROLLBACK SEGMENT

| [ ]

ROLLBACK SEGMENT nume_segm_anulare }

[ ] ROLLBACK SEGMENT

| [ ]

ROLLBACK SEGMENT nume_segm_anulare}.] }

| NEVER REFRESH}

Optiunea FAST indica metoda de reactualizare incrementala, care se efectueaza corespunzator modificarilor survenite in tabelele master. Modificarile sunt stocate intr-un fisier log asociat tabelului master. Clauza COMPLETE implica reactualizarea completa, care se realizeaza prin reexecutarea completa a cererii din definitia vizualizarii materializate. Clauza FORCE este implicita si presupune reactualizarea de tip FAST, daca este posibil. In caz contrar, reactualizarea va fi de tip COMPLETE.

Clauza ON COMMIT indica declansarea unei operatii de reactualizare de tip FAST ori de cate ori sistemul permanentizeaza o tranzactie care opereaza asupra unui tabel master al vizualizarii materializate. Clauza nu este permisa pentru vizualizarile materializate ce contin tipuri obiect.

Clauza ON DEMAND este implicita si indica efectuarea reactualizarii vizualizarii materializate la cererea utilizatorului, prin intermediul procedurilor specifice din pachetul DBMS_MVIEW (REFRESH, REFRESH_ALL_MVIEWS, REFRESH_DEPENDENT).

Optiunile START WITH si NEXT nu pot fi specificate daca s-au precizat clauzele ON COMMIT sau ON DEMAND. Expresiile de tip data calendaristica indicate in cadrul acestor optiuni specifica momentul primei reactualizari automate si determina intervalul dintre doua reactualizari automate consecutive.

Clauza WITH PRIMARY KEY este implicita si permite ca tabelele master sa fie reorganizate fara a afecta eligibilitatea vizualizarii materializate pentru reactualizarea de tip FAST. Tabelul master trebuie sa contina o constrangere PRIMARY KEY. Optiunea nu poate fi specificata pentru vizualizari materializate obiect. Optiunea WITH ROWID asigura compatibilitatea cu tabelele master din versiunile precedente lui Oracle8.

Clauza USING ROLLBACK SEGMENT specifica segmentul de anulare distant care urmeaza sa fie utilizat pentru reactualizarea vizualizarii materializate. Cuvantul cheie DEFAULT determina ca sistemul sa aleaga acest segment in mod automat. Optiunile MASTER si LOCAL specifica segmentul de anulare distant care urmeaza sa fie utilizat pe site-ul distant pentru vizualizarea materializata individuala, respectiv pentru grupul local de reactualizare care contine vizualizarea materializata. Optiunea LOCAL este implicita.

Clauza NEVER REFRESH previne reactualizarea vizualizarii materializate prin mecanisme Oracle sau prin proceduri. Pentru a permite reactualizarea, trebuie efectuata o operatie ALTER MATERIALIZED VIEW.REFRESH.

Clauza FOR UPDATE permite actualizarea unei vizualizari materializate. QUERY REWRITE permite specificarea faptului ca vizualizarea materializata este eligibila pentru operatia de rescriere a cererilor.

Optiunea AS specifica cererea care defineste vizualizarea materializata. Daca in clauza FROM a cererii din definitia vizualizarii materializate se face referinta la o alta vizualizare materializata, atunci aceasta va trebui reactualizata intotdeauna inaintea celei create in instructiunea curenta.

Exemplu

a)      Sa se creeze si sa se completeze cu inregistrari o vizualizare materializata care va contine titlul operelor de arta, numele artistului si suma valorilor politelor de asigurare incheiate.

Reactualizarile ulterioare ale acestei vizualizari se vor realiza prin reexecutarea cererii din definitie. Vizualizarea creata va putea fi aleasa pentru rescrierea cererilor.

CREATE MATERIALIZED VIEW opera_artist_polite

BUILD IMMEDIATE

REFRESH COMPLETE

ENABLE QUERY REWRITE

AS SELECT o.titlu, a.nume, SUM(p.valoare) suma_polite

FROM opera o, artist a, polita_asig p

WHERE o.cod_artist = a.cod_artist

AND o.cod_opera = p.cod_opera

GROUP BY o.cod_opera, o.titlu, a.nume;

b)      Sa se creeze tabelul opera_artist_polite. Acesta va fi utilizat ca tabel sumar preexistent in crearea unei vizualizari materializate ce va permite diferente de precizie si rescrierea cererilor.

CREATE TABLE opera_artist_polite(

titlu VARCHAR2(25),

nume VARCHAR2(15),

suma_polite NUMBER);

CREATE MATERIALIZED VIEW opera_artist_polite

ON PREBUILT TABLE WITH REDUCED PRECISION

ENABLE QUERY REWRITE

AS SELECT o.titlu, a.nume, SUM(p.valoare) suma_polite

FROM opera o, artist a, polita_asig p

WHERE o.cod_artist = a.cod_artist

AND o.cod_opera = p.cod_opera

GROUP BY o.cod_opera, o.titlu, a.nume;

c)      Sa se creeze o vizualizare materializata care contine informatiile din tabelul artist, permite reorganizarea acestuia si este reactualizata la momentul crearii, iar apoi la fiecare 5 minute.

CREATE MATERIALIZED VIEW artist_vm

REFRESH FAST START WITH SYSDATE NEXT SYSDATE + 1/288

WITH PRIMARY KEY

AS SELECT * FROM artist;

Pentru reactualizarea de tip FAST, este necesar un fisier log in care sa fie stocate modificarile. Instructiunea precedenta genereaza eroarea "ORA-23413: table "artist" does not have a materialized view log". Pentru remedierea acestei situatii, inainte de crearea vizualizarii se va lansa urmatoarea comanda:

CREATE MATERIALIZED VIEW LOG ON artist;

Comanda ALTER MATERIALIZED VIEW permite interventia asupra unei vizualizari materializate, intr-unul din urmatoarele sensuri:

modificarea caracteristicilor de stocare;

modificarea metodei, modului sau timpului de reactualizare (refresh);

modificarea structurii, astfel incat sa devina un alt tip de vizualizare materializata;

activarea sau dezactivarea functiei de rescriere a cererilor.

ALTER MATERIALIZED VIEW [ schema.]nume_viz_materializata

[atribute_fizice] [USING INDEX atribute_fizice]

[ QUERY REWRITE

| COMPILE | CONSIDER FRESH} ];

Optiunea USING INDEX modifica parametrii de stocare asociati indexului folosit de sistem pentru a intretine datele vizualizarii materializate.

Clauza REBUILD permite regenerarea operatiilor de reactualizare atunci cand se modifica un tip care este referit in vizualizarea materializata. Specificarea acestei optiuni interzice utilizarea altor clauze in aceeasi instructiune ALTER MATERIALIZED VIEW.

Clauza alter_vm_refresh permite modificarea metodelor, modurilor si timpului implicit de reactualizare automata. In cazul modificarii continutului tabelelor master ale vizualizarii materializate, datele din vizualizare trebuie reactualizate astfel incat sa reflecte datele existente.

Clauza QUERY REWRITE, prin optiunile ENABLE si DISABLE, determina ca vizualizarea materializata sa fie, sau nu, eligibila pentru rescrierea cererilor.

Clauza COMPILE permite revalidarea explicita a vizualizarii materializate. Daca un obiect de care depinde vizualizarea materializata este suprimat sau modificat, vizualizarea ramane accesibila, dar nu este eligibila pentru rescrierea cererilor. Clauza este utila pentru revalidarea explicita a vizualizarii materializate, astfel incat aceasta sa devina eligibila in operatia de rescriere a cererilor.

Optiunea CONSIDER FRESH indica sistemului sa considere vizualizarea materializata ca fiind reactualizata si deci eligibila pentru rescrierea cererilor.

Exemplu

Sa se modifice vizualizarea materializata opera_artist_polite creata anterior, astfel incat metoda de reactualizare implicita sa fie de tip FAST, iar intervalul de timp la care se realizeaza reactualizarea sa fie de 7 zile. Nu va fi permisa utilizarea acestei vizualizari pentru rescrierea cererilor.

ALTER MATERIALIZED VIEW opera_artist_polite

REFRESH FAST NEXT SYSDATE + 7 DISABLE QUERY REWRITE;

Pentru ca nu se specifica valoarea corespunzatoare optiunii START WITH in clauza REFRESH, urmatoarea reactualizare va avea loc la momentul stabilit prin comanda de creare a vizualizarii materializate sau prin ultima comanda de modificare a acesteia. Sistemul va reactualiza vizualizarea evaluand expresia din clauza NEXT, iar apoi va executa aceasta operatie o data pe saptamana.

DROP MATERIALIZED VIEW [schema.]nume_viz_materializata;



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1034
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved