CATEGORII DOCUMENTE |
Dezvoltatorul de aplicatii trebuie sa fie profund constient de organizarea logica a bazei de date. La nivel logic, baza de date este alcatuita din scheme. O schema este o colectie de structuri logice de date, numite si obiecte ale schemei. Dupa cum am vazut in capitolul anterior, o schema este proprietatea unui utilizator al bazei de date si are acelasi nume cu acesta. De aceea se mai spune ca obiectele schemei sunt proprietatea utilizatorului respectiv.
Definitiile tuturor obiectelor schemei sunt pastrate in dictionarul bazei de date. Dupa cum vom vedea in continuare, unele dintre obiectele schemei (tabele, clustere, indecsi) contin date, pentru care este necesar un spatiu de stocare. Datele din fiecare astfel de obiect sunt stocate din punct de vedere logic intr-un spatiu tabel. Din punct de vedere fizic, aceste date sunt stocate intr-unul sau mai multe din fisierele de date asociate acelui spatiu tabel. In general, intr-un spatiu tabel sunt stocate mai multe obiecte. Dupa cum am vazut in capitolul 4, la crearea tabelelor, clusterelor sau indecsilor se poate specifica spatiul tabel corespunzator si spatiul alocat obiectului creat (prin intermediul parametrilor de stocare).
Obiectele schemei pot fi create si manipulate folosind comenzi SQL. Principalele obiecte ale schemei sunt urmatoarele:
Tabele (tables)
vederi (views)
indecsi (indexes)
clustere (clusters) si clustere hash (hash cluster)
secvente (sequences)
sinonime (synonyms)
proceduri si functii stocate/rezidente (stored procedures and functions)
pachete stocate (stored packages)
declansatoare ale bazei de date (database triggers)
instantanee (snapshots)
legaturi ale bazei de date (database link)
Acest capitol prezinta pe larg fiecare dintre aceste obiecte. In plus, ultima sectiune din capitol este dedicata dictionarului bazei de date.
1. Tabele
Tabelul este principala structura logica de stocare a datelor. Dupa cum am vazut in capitolul 1, un tabel este o structura bidimensionala formata din coloane si randuri. Coloanele mai sunt numite si campuri, iar randurile inregistrari. In general, fiecare tabel este stocat intr-un spatiu tabel[1]. Dupa cum am vazut in sectiunea 4.2.1, portiunea dintr-un spatiu tabel folosita pentru stocarea datelor unui tabel se numeste segment tabel. Cu alte cuvinte, segmentul tabel este omologul fizic al unui tabel.
In anumite situatii, pentru a mari eficienta operatiilor de scriere/citire a datelor, mai multe tabele pot fi stocare impreuna, formand clustere (grupuri de tabele). Despre acestea vom vorbi mai tarziu, in sectiunea 4. O noutate adusa de versiunea Oracle8 este posibilitatea de crea un tabel pe baza unui index, reducand astfel timpul de acces la date prin interogari care folosesc ca termen de comparatie coloanele indexate. Despre acestea vom vorbi in sectiunea 3.3, deocamdata referindu-ne doar la tabele obisnuite.
1.1 Crearea tabelelor
Un tabel poate fi creat prin comanda SQL create table, in care trebuie specificat numele si tipul de date pentru fiecare coloana a tabelului. De exemplu:
create table salariat(
cod_salariat number(10),
nume varchar2(10),
prenume varchar2(10),
data_nastere date,
salariu number(10),
manager number(10),
cod_dept number(10),
cod_tara number(10));
O sintaxa simplificata a comenzii CREATE TABLE este prezentata in continuare:
CREATE TABLE nume_tabel
(nume_coloana tip_data [DEFAULT expresie]
[, nume_coloana tip_data [DEFAULT expresie] )
PCTFREE intreg] [PCTUSED intreg]
TABLESPACE spatiu_tabel]
STORAGE parametrii_de_stocare]
unde:
DEFAULT desemneaza o valoare implicita pentru coloana, folosita in cazul in care la inserarea unui rand in tabel nu este specificata o valoare explicita pentru coloana in cauza.
TABLESPACE specifica spatiul tabel in care va fi stocat tabelul. Daca acesta nu este mentionat explicit, se va folosi spatiul tabel implicit (default) al utilizatorului care este proprietarul schemei din care face parte tabelul (vezi exemplul de mai sus).
Valorile parametrilor PCTFREE si PCTUSED determina gradul de utilizare a blocurilor din extinderile segmentului tabel, vezi sectiunea 4.4.
Clauza STORAGE este folosita pentru setarea parametrilor de stocare (INITIAL NEXT PCTINCREASE MINEXTENTS MAXEXTENTS) prin intermediul carora se specifica marimea si modul de alocare a extinderilor segmentului tabel, vezi sectiunea 4.1.1.
create table salariat(
cod_salariat number(10),
nume varchar2(10),
prenume varchar2(10),
data_nastere date,
salariu number(10),
manager number(10),
cod_dept number(10),
cod_tara number(10) DEFAULT 40)
pctfree 20 pctused 70
tablespace ts_alfa
storage (initial 100K next 100K);
La crearea unui tabel este necesara specificarea tipului de data pentru fiecare coloana a tabelului. Urmatorul tabel arata tipurile de date scalare cel mai des folosite.
Tip de data |
Descriere |
VARCHAR2(n) |
Siruri de caractere de lungime variabila avand lungimea maxima n bytes. Lungimea maxima n trebuie neaparat specificata. In versiunea Oracle 8, valoarea maxima a lungimii n de 4000. |
CHAR(n) |
Siruri de caractere de lungime fixa n bytes. Valoarea implicita pentru n este 1. Daca intr-o coloana avand acest tip se insereaza siruri de caractere mai scurte decat lungimea specificata, atunci Oracle insereaza la dreapta numarul necesar de spatii libere (blank-uri) pentru atingerea lungimii specificate. In versiunea Oracle 8, valoarea maxima a lungimii n este de 2000. |
NUMBER(n, m) |
Numere cu precizia n si scala m. Precizia reprezinta numarul maxim de digiti permis, care nu poate depasi 38. Scala reprezinta numarul de zecimale pe care le va avea numarul si poate avea valori intre -84 si 127. |
NUMBER(n) |
Numere intregi avand precizia maxima n. Valoarea maxima pentru n este de 38. |
NUMBER |
Numere in virgula mobila avand o precizie (numar maxim de digiti) de 38 de digiti. |
DATE |
Date calendaristice avand valori intre 1 Ianuarie 4712 i.e. n si 31 Decembrie 4712 e.n. Pentru fiecare data calendaristica sunt inregistrate urmatoarele informatii: secolul, anul, luna, ziua, ora, minutul si secunda. Pentru a specifica o valoare de tip data calendaristica, este necesara convertirea unui sir de caractere sau a unui numar folosind functia TO_DATE. Atunci cand sunt folosite in expresii de tip data calendaristica, Oracle converteste automat siruri de caractere care au formatul implicit de data calendaristica. Formatul implicit de data calendaristica este specificat de parametrul de initializare NLS_DATE FORMAT si este un sir de caractere. De exemplu, acesta poate fi 'DD-MON-YY', care cuprinde un numar de doi digiti pentru ziua din luna, o abreviatie a numelui lunii si ultimii doi digiti ai anului - de exemplu '01-JAN-99' reprezinta 1 Ianuarie 1999. |
LONG |
Siruri de caractere de dimensiune variabila pana la 2 Gbytes sau 231-1 bytes. O singura coloana de tip LONG este admisa in cadrul unui tabel. |
RAW(n) |
Se foloseste pentru a stoca date binare siruri de biti) de lungime variabila, avand lungimea maxima n bytes. Valoarea lui n trebuie specificata si trebuie sa nu depaseasca 2000. Se poate folosi pentru stocarea imaginilor grafice sau a sunetului digital. Este similar cu VARCHAR2, cu exceptia dimensiunii maxime si a faptului ca pentru tipul de data RAW nu se pot interpreta datele. |
LONG RAW |
Se foloseste pentru a stoca date binare (siruri de biti) de lungime variabila de pana la 2Gbytes. Tipul de data LONG RAW este similar tipului de data LONG, exceptie facand faptul ca pentru tipul de data LONG RAW nu se pot interpreta datele. |
Tipul de data poate fi urmat de unul sau mai multe numere in paranteza care furnizeaza informatii despre dimensiunea coloanei. Dimensiunea coloanei determina dimensiunea maxima a oricarei valori pe care o poate avea coloana. Coloanele de tip VARCHAR2 trebuie sa aiba specificata o marime. Coloanele NUMBER si CHAR pot avea o marime specificata, dar in lipsa acesteia se foloseste o valoare implicita.
Alte date tipuri de date scalare furnizate de Oracle SQL sunt NCHAR si NVARCHAR2, folosite pentru reprezentarea caracterelor limbilor nationale. Pentru o descriere mai detaliata a acestor tipuri de date se poate consulta Anexa 3, care cuprinde toate tipurile de date din PL SQL (printre care se regasesc si tipurile de date Oracle SQL). In Oracle8, alaturi de aceste tipuri de date scalare, exista si tipuri de date LOB (Large Objects), care specifica locatia unor obiecte de dimensiuni mari. O descriere mai detaliata a tuturor acestor tipuri de date se gaseste in Capitolul 10 si Anexa 3. In plus, optiunea obiect din Oracle8 permite definirea de catre utilizator a unor tipuri de date. Aceasta optiune va fi discutata in detaliu in Capitolul 10.
In Oracle, tabelele pot fi create sau modificate in orice moment, chiar daca in momentul respectiv exista utilizatori care folosesc baza de date. La crearea unui tabel nu este nevoie sa se specifice dimensiunea maxima a acestuia, ea fiind determinata pana la urma de cat de mult spatiu a fost alocat spatiului tabel in care este creat tabelul. Unui tabel ii poate fi repartizat mai mult spatiu in mod automat, in cazul in care spatiul alocat initial a fost umplut.
1.2 Tabele partitionate
O noutate introdusa in Oracle8 este posibilitatea de a partitiona tabele, adica de a imparti tabelul in mai multe parti independente, fiecare cu parametri de stocare potential diferiti si cu posibilitatea ca parti diferite ale tabelului sa se gaseasca pe spatii tabel diferite. Fiecare partitie a tabelului contine inregistrari ce au valoarea cheii intr-un anumit interval specificat. In acest sens, partitionarea este foarte folositoare in cazul tabelelor de dimensiuni foarte mari.
Partitionarea este transparenta pentru utilizatori si aplicatii. Utilizarea tabelelor partitionate ofera cateva avantaje. Daca o parte a tabelului este inaccesibila, celelalte parti sunt disponibile pentru inserare, selectie, modificare si stergere; numai acele inregistrari care sunt in acea partitie nu vor fi accesibile. De asemenea, se poate bloca accesul la o parte a tabelului in timp ce restul inregistrarilor sunt disponibile.
Fiecare partitie poate avea proprii sai parametri de stocare PCTFREE si PCTUSED INITIAL NEXT PCTINCREASE MINEXTENTS MAXEXTENTS. Acest lucru este important deoarece o parte a tabelului poate sa contina un numar mult mai mare de inregistrari decat alta, necesitand, pentru o functionare eficienta, parametri diferiti de stocare. Posibilitatea de a atribui in mod individual parametri de stocare fiecarei parti ofera o mai mare flexibilitate in stocarea datelor. De asemenea, fiecare parte poate fi stocata in spatii tabel diferite. Acest lucru este avantajos in cazul in care unul dintre spatiile tabel este inaccesibil.
Crearea tabelelor partitionate
Sintaxa comenzii CREATE TABLE in cazul partitionarii tabelului este:
CREATE TABLE nume_tabel
(nume_coloana tip_data [DEFAULT expresie]
[, nume_coloana tip_data [DEFAULT expresie] )
PARTITION BY RANGE (lista_coloane)
(PARTITION nume_partitie VALUES LESS GREATER THAN (lista_valori)
[PCTFREE intreg] [PCTUSED intreg]
[TABLESPACE spatiu_tabel]
[STORAGE parametrii_de_stocare]
PARTITION nume_partitie VALUES LESS GREATER THAN (lista_valori)
[PCTFREE intreg] [PCTUSED intreg]
[TABLESPACE spatiu_tabel]
[STORAGE parametrii_de_stocare]].)
unde
lista_coloane este o lista ordonata de coloane care determina partitia
lista_valori este o lista ordonata de valori pentru coloanele din lista_coloane
create table salariat_part(
cod_salariat number(10),
nume varchar2(10),
prenume varchar2(10),
data_nastere date,
salariu number(10),
manager number(10),
cod_dept number(10),
cod_tara number(10))
PARTITIONED BY RANGE(salariu)
(PARTITION salariu_mic VALUES LESS THAN (1000)
tablespace ts_alfa
storage (initial 50K next 50K),
PARTITION salariu_mediu VALUES LESS THAN (10000)
tablespace ts_beta
storage (initial 100K next 100K),
PARTITION salariu_mare VALUES LESS THAN (9999999999)
tablespace ts_alfa
storage (initial 50K next 50K));
Nota: MAXVALUE are practic semnificatia de "infinit", ultima parte a tabelului cuprinzand valorile de peste 10000.
1.3 Constrangeri
Alaturi de numele si tipurile de date ale coloanelor, la definirea unui tabel se pot specifica si constrangeri (restrictii) de integritate (constraints). In Oracle, constrangerile sunt folosite pentru a impune anumite restrictii asupra datelor tabelului sau pentru a pastra integritatea referentiala a bazei de date. Constrangerile se pot defini la nivel de coloana sau la nivel de tabel, dupa cum ele se refera la datele unei singure coloane sau la datele mai multor coloane. In Oracle exista urmatoarele tipuri de constrangeri:
Constrangere |
Nivel de definire |
Functionalitate |
NOT NULL |
Coloana |
Impune ca valorile coloanei sa fie diferite de Null. |
UNIQUE |
Coloana, tabel |
Impune unicitatea valorilor unei coloane sau a unei combinatii de coloane. |
PRIMARY KEY |
Coloana, tabel |
Impune unicitatea valorilor unei coloane sau a unei combinatii de coloane. In plus, valorile Null nu sunt permise in coloanele care fac parte din PRIMARY KEY. Intr-un tabel poate exista o singura cheie primara. |
[FOREIGN KEY] references |
Coloana, tabel |
Impune regula de integritate referentiala in cadrul aceluiasi tabel sau intre tabele diferite. O cheie straina este folosita in relatie cu o coloana sau combinatie de coloane definite ca UNIQUE sau PRIMARY KEY |
CHECK |
Coloana |
Defineste explicit o conditie pe care trebuie sa o satisfaca datele din fiecare rand al tabelului |
In cazul folosirii constrangerilor la definirea unui tabel, sintaxa comenzii SQL CREATE TABLE se completeaza in modul urmator:
CREATE TABLE nume_tabel
(nume_coloana tip_data [DEFAULT expresie] [constr_ coloana [constr_ coloana] ]
[nume_coloana tip_data [DEFAULT expresie] [constr_ coloana [constr_ coloana]]]
constrangere_tabel [,constrangere_tabel] .)
Sintaxa unei constrangeri la nivel de coloana este:
CONSTRAINT nume constrangere]
iar sintaxa unei constrangeri la nivel de tabel este:
CONSTRAINT nume constrangere]
unde
CONSTRAINT permite specificarea unui nume pentru integritatea definita. Daca aceasta optiune este omisa, Oracle va genera in mod automat un nume, de forma SYS_Cn, unde n reprezinta un numar care face ca numele constrangerii sa fie unic.
NOT NULL UNIQUE PRIMARY KEY FOREIGN KEY REFERENCES CHECK sunt tipurile de constrangeri definite in tabelul de mai sus.
ON DELETE CASCADE este o clauza care se poate folosi la definirea unei restrictii de integritate referentiala; in acest caz, in cazul stergerii unei inregistrari care contine cheia primara sau unica la care face referire cheia straina, integritatea referentiala este mentinuta prin stergerea tuturor inregistrarilor ce contin chei straine dependente,.
In exemplul de mai jos sunt create doua tabele departament si salariat, fiind impuse urmatoarele constrangeri:
combinatia (cod_dept, cod_tara) este cheia primara a tabelului salariat. In acest caz, constrangerea este definita la nivel de tabel.
cod_salariat este cheia primara a tabelului salariat. In acest caz, constrangerea este definita la nivel de coloana.
nume este o coloana a tabelului salariat care nu admite valori Null.
manager este o cheie straina a tabelului salariat care face referinta la cheia primara cod_salariat a aceluiasi tabel. In acest caz, constrangerea este definita la nivel de coloana.
valorile pentru coloana salariu din tabelul salariat trebuie sa fie mai mari ca 0
combinatia de coloane (nume, prenume, data_nastere) din tabelul salariat trebuie sa aiba valori unice. In acest caz, constrangerea este definita la nivel de tabel.
combinatia (cod_dept, cod_tara) este o cheie straina a tabelului salariat care face referinta la cheia primara a tabelului departament. In acest caz, constrangerea este definita la nivel de tabel. Remarcati ca in cazul constrangerii de cheie straina, sintaxa difera in cazul definirii la nivel de coloana fata de cel al definirii la nivel de tabel, in prima situatie lipsind cuvintele "FOREIGN KEY
create table departament(
cod_dept number(10),
cod_tara number(10),
nume_dept varchar2(10),
constraint dept_pk primary key(cod_dept, cod_tara));
create table salariat(
cod_salariat number(10) constraint sal_pk primary key,
nume varchar2(10) not null,
prenume varchar2(10),
data_nastere date,
manager number(10)
constraint sal_sal_fk references salariat(cod_salariat),
salariu number(10)
constraint sal_ck check(salariu > 0),
cod_dept number(10),
cod_tara number(10),
unique(nume, prenume, data_nastere),
constraint sal_dept_fk foreign key(cod_dept, cod_tara) references departament(cod_dept, cod_tara));
Constrangerea FOREIGN KEY impune integritatea referentiala intre tabelul master (departament) si tabelul detaliu (salariat). De exemplu, aceasta inseamna ca un salariat nu poate fi adaugat decat daca departamentul corespunzator este fie NULL sau exista in tabelul departament. La fel, nu poate fi sters un departament daca exista angajati in acel departament. Exista insa si posibilitatea de a permite stergerea unui departament in care exista salariati; in acest caz, pentru mentinerea integritatii, este necesara si stergerea tuturor angajatilor dependenti. Acest lucru se poate face prin adaugarea clauzei ON DELETE CASCADE pentru constrangerea FOREIGN KEY
create table salariat
(cod_salariat number(10) constraint sal_pk primary key,
nume varchar2(10) not null,
prenume varchar2(10),
data_nastere date,
manager number(10)
constraint sal_sal_fk references salariat(cod_salariat),
salariu number(10)
constraint sal_ck check(salariu > 1000),
cod_dept number(10),
cod_tara number(10),
unique(nume, prenume, data_nastere),
constraint sal_dept_fk foreign key(cod_dept, cod_tara) references departament(cod_dept, cod_tara)
on delete cascade);
Toate detaliile despre constrangeri sunt stocate in dictionarul de date Oracle. De exemplu, pentru a vizualiza toate constrangerile definite pentru tabelele de mai sus putem executa urmatoarea interogare asupra vederii ALL_CONSTRAINTS
SELECT CONSTRAINT_NAME, CONSTRAINT_TYPE, TABLE_NAME
FROM ALL_CONSTRAINTS
WHERE TABLE_NAME IN ('SALARIAT', 'DEPARTAMENT');
care va produce rezultatul:
CONSTRAINT_NAME C TABLE_NAME
SYS_C002725 C SALARIAT
SAL_PK P SALARIAT
SAL_CK C SALARIAT
SYS_C002728 U SALARIAT
SAL_SAL_FK R SALARIAT
SAL_DEPT_FK R SALARIAT
DEPT_PK P DEPARTAMENT
7 rows selected.
Fiecare constrangere are asociat un nume. In general este convenabil ca acesta sa fie dat in mod explicit de cel care creeaza tabelul (cum este cazul constrangerilor CHECK PRIMARY KEY si FOREIGN KEY din exemplul de mai sus) pentru ca in acest mod constrangerea poate fi referita mai usor dupa aceea. In caz contrar (de exemplu constrangerile UNIQUE si NOT NULL din exemplul de mai sus) numele este generat automat si are forma "SYS_C"
Constrangeri amanate.
In versiunea Oracle7 fiecare constrangere este verificata de fiecare data cand este executata o instructiune DML (inserare, actualizare sau stergere). In versiunea Oracle8 exista posibilitatea ca o constrangere sa fie amanata (DEFERRED). In cazul acesta, mai multe comenzi SQL pot fi executate fara a se verifica restrictia, acesta fiind verificata numai la sfarsitul tranzactiei, atunci cand este executata instructiunea COMMIT. Daca vreuna dintre comenzile DML ale tranzactiei incalca restrictia, atunci intreaga tranzactie este derulata inapoi si este returnata o eroare.
In Oracle8, orice constrangere pe tabela sau pe coloana poate fi definita ca amanabila folosind cuvantul cheie DEFERABLE; optiunea contrara este NOT DEFERABLE care este si optiunea implicita:
NOT DEFERABLE DEFERABLE INITIALLY IMMEDIATE INITIALLY DEFERRED
Cand o constrangere este specificata ca fiind DEFERRABLE, se poate specifica in plus starea initiala a constrangerii, care poate fi INITIALLY DEFERRED sau INITIALLY IMMEDIATE, setarea implicita fiind INITIALLY IMEDIATE. Daca o constrangere are starea initiala INITIALLY IMMEDIATE, ea este pornita in modul fara amanare, fiind verificata imediat dupa fiecare instructiune executata. Daca starea initiala este INITIALLY DEFERRABLE, atunci constrangerea este verificata la executarea unei comenzi COMMIT sau la schimbarea starii constrangerii in IMMEDIATE
Schimbarea starii unei constrangeri se poate face folosind comanda SQL SET CONSTRAINT
SET CONSTRAINT [DEFERRED | IMMEDIATE]
Posibilitatea de a amana verificarea unei constrangeri este folositoare in special in cazul unor restrictii de integritate referentiala, in acest mod fiind posibila inserarea unor randuri in tabela copil (detaliu), care contine cheia straina, inaintea randului corespunzator din tabela parinte (master), care contine cheia primara.
In exemplul de mai jos, cele doua restrictii de integritate referentiala au fost definite ca amanabile.
create table departament(
cod_dept number(10),
cod_tara number(10),
nume_dept varchar2(10),
constraint dept_pk primary key(cod_dept, cod_tara));
create table salariat(
cod_salariat number(10) constraint sal_pk primary key,
nume varchar2(10) not null,
prenume varchar2(10),
data_nastere date,
manager number(10)
constraint sal_sal_fk references salariat(cod_salariat) deferrable,
salariu number(10)
constraint sal_ck check(salariu > 0),
cod_dept number(10),
cod_tara number(10),
unique(nume, prenume, data_nastere),
constraint sal_dept_fk foreign key(cod_dept, cod_tara) references departament(cod_dept, cod_tara) deferrable);
Deoarece starea initiala a restrictiilor nu a fost precizata, ea va fi implicit INITIALLY IMMEDIATE. Pentru a trece restrictiile in starea DEFERRED se foloseste instructiunea SET CONSTRAINT
SET_CONSTRAINT sal_sal_fk DEFERRED
SET CONSTRAINT sal_dept_fk DEFERRED;
De exemplu, urmatoarea secventa de instructiuni SQL se executa cu succes daca restrictia referentiala sal_dept_fk este DEFERRED, dar esueaza in caz contrar.
insert into salariat(cod_salariat, nume, cod_dept, cod_tara)
values(100, 'Popescu', 1, 40);
insert into departament(cod_dept, cod_tara, nume_dept)
values(1, 40, 'IT');
commit;
1.4 Crearea si popularea simultana a tabelelor
Atunci cand se creeaza un tabel exista posibilitatea ca in acelasi timp tabelul sa fie si populat. Pentru aceasta, in cadrul comenzii SQL create table se va utiliza clauza AS urmata de o interogare pe unul sau mai multe tabele. In mod evident, numarul coloanelor din definitia tabelului trebuie sa coincida cu acela din interogare.
Exemplul urmator creeaza un tabel care contine toate inregistrarile din tabelul salariat avand tara cu codul 100:
create table salariat_100(
cod_salariat, nume, prenume, data_nastere, manager, salariu, cod_dept)
as
select cod_salariat, nume, prenume, data_nastere, manager, salariu, cod_dept
from salariat
where cod_tara = 100;
Atunci cand la crearea unui tabel se foloseste clauza AS nu este permisa specificarea tipurilor de date ale coloanelor, acestea fiind preluate automat de la tabelul de baza. Pe de alta parte insa, restrictiile definite pentru tabelul de baza, cu exceptia celor NOT NULL nu sunt preluate automat de noul tabel. De exemplu, tabelul salariat_100 va avea o singura restrictie de integritate, NOT NULL pentru coloana nume. Folosind clauza AS se pot crea tabele si din mai multe tabele de baza, de exemplu un tabel care contine codul, numele si prenumele salariatilor precum si numele departamentului in care lucreaza se poate crea in modul urmator:
create table sal_dept_temp(
cod_salariat, nume, prenume, nume_dept)
as
select s.cod_salariat, s.nume, s.prenume, d.nume_dept
from salariat s, departament d
where s.cod_dept = d.cod_dept
and s.cod_tara = d.cod_tara;
1.5 Modificarea tabelelor
Un tabel existent poate fi modificat folosind comanda SQL alter table. Se pot efectua urmatoarele tipuri de modificari:
Ø Adaugarea de noi coloane (impreuna cu eventualele constrangeri pentru aceste coloane):
alter table departament
add (localitate VARCHAR2(10) NOT NULL);
Ø Modificarea tipului de date sau a marimii unor coloane existente:
ALTER TABLE departament
MODIFY (nume_dept VARCHAR2(20));
Nota: schimbarea tipului de date al unei coloane sau scaderea dimensiunii acesteia nu este posibila decat daca acea coloana este goala; in caz contrar, o astfel de operatie ar putea duce la modificarea datelor din tabel.
Ø Stergerea unor constrangeri existente:
ALTER TABLE salariat
DROP CONSTRAINT sal_ck;
Trebuie remarcat ca o constrangere PRIMARY KEY la care face referinta o constrangere FOREIGN KEY nu poate fi stearsa decat daca impreuna cu constrangerea PRIMARY KEY sunt sterse si toate constrangerile referentiale asociate. Pentru acesta se foloseste clauza CASCADE
ALTER TABLE departament
DROP CONSTRAINT dept_pk CASCADE;
Comanda SQL de mai sus sterge atat constrangerea PRIMARY KEY dept_pk de pe tabelul departament, cat si constrangerea FOREIGN KEY de pe tabelul salariat.
Ø Adaugarea de noi constrangeri:
ALTER TABLE salariat
ADD (CONSTRAINT data_ck CHECK(data_nastere > '1-Jan-1900'));
Ø Activarea (enable) sau dezactivarea (disable) unor constrangeri existente;
alter table salariat disable constraint sal_dept_fk;
La crearea unui tabel, toate constrangerile definite sunt implicit active daca nu a fost folosita optiunea disable. Daca o constrangere este dezactivata, atunci asupra datelor pot fi executate operatii care incalca acea constrangere. O constrangere care a fost dezactivata poate fi ulterior activata numai daca datele care au fost introduse, actualizate sau sterse cat timp ea a fost dezactivata nu incalca aceasta constrangere. De exemplu, constrangerea sal_dept_fk poate fi reactivata numai daca dupa executia comenzii de mai sus nu au fost introduse date in tabelul salariat care incalca integritatea referentiala:
alter table salariat enable constraint sal_dept_fk;
In versiunea Oracle8, alaturi de starea activa (ENABLED) si inactiva (DISABLED), o constrangere poate avea o a treia stare: impusa (ENFORCED). Atat restrictiile activate cat si cele dezactivate pot fi trecute in starea ENFORCED. O restrictie poate fi trecuta in starea ENFORCED folosind comanda ALTER TABLE cu clauza ENFORCE CONSTRAINT
alter table salariat enforce constraint sal_dept_fk;
In cazul executarii acestei comenzi, restrictia este impusa dupa executarea comenzii. Deci comanda ALTER TABLE ENFORCE CONSTRAINT nu va esua daca in tabel exista inregistrari care incalca restrictia respectiva (cum se intampla in cazul executarii unei comenzi ALTER TABLE ENABLE CONSTRAINT). Dar, dupa ce restrictia a fost impusa, ea nu va mai permite inserarea sau actualizarea inregistrarilor care nu o respecta, cum s-ar fi intamplat daca restrictia era dezactivata.
Nota: Comanda SQL ALTER TABLE nu permite stergerea dintr-un tabel a unei coloane existente. Daca totusi se doreste acest lucru, se poate folosi comanda CREATE TABLE cu clauza AS, in care se selecteaza coloanele dorite. De asemenea, comanda SQL ALTER TABLE nu permite modificarea definitiei unei constrangeri existente.
Ø Din punct de vedere fizic, comanda ALTER TABLE permite schimbarea parametrilor PCTFREE si PCTUSED si a parametrilor din clauza STORAGE folosind sintaxa:
ALTER TABLE nume_tabel
PCTFREE intreg] [PCTUSED intreg]
STORAGE parametrii_de_stocare]
Ø De asemenea, comanda ALTER TABLE permite alocarea si dealocarea manuala a spatiului utilizat de catre un tabel. Alocarea manuala a spatiului pentru un tabel se face prin adaugarea de noi extinderi. Alocarea manuala se poate face in general:
inainte de o incarcare masiva a datelor;
pentru a controla distributia extinderilor unui tabel in cadrul fisierelor.
Dealocarea spatiului asociat unui tabel reprezinta eliberarea spatiului nefolosit de acesta (care nu a fost niciodata folosit sau care a devenit intre timp gol datorita stergerii de randuri).
Pentru a aloca sau dealoca spatiul utilizat de un tabel se foloseste comanda ALTER TABLE cu urmatoarele sintaxe:
ALTER TABLE nume_tabel
ALLOCATE EXTENT SIZE intreg [K M
[DATAFILE nume_fisier_de_date] )]
respectiv
ALTER TABLE nume_tabel
DEALLOCATE UNUSED KEEP intreg [K M
unde:
DATAFILE specifica fisierul de date (din spatiul tabel asociat tabelului) care va cuprinde noua extindere. Daca aceasta optiune este omisa, fisierul este ales de catre Oracle
SIZE specifica dimensiunea noii extinderi. Daca optiunea SIZE este omisa atunci Oracle va stabili dimensiunea extinderii pe baza parametrilor de stocare a tabelului.
Cu ajutorul optiunii KEEP se poate specifica un numar de bytes (Kbytes, Mbytes) din spatul liber al tabelului ce nu vor fi dealocati.
1.6 Distrugerea tabelelor
Pentru a distruge un tabel in Oracle se poate folosi comanda SQL drop table:
DROP TABLE salariat;
Pe de alta parte insa, daca vom folosi o comanda similara pentru a distruge un tabel a carui cheie primara face referinta la o cheie straina a altui tabel, adica ultimul tabel are definita o constrangere FOREIGN KEY corespunzatoare, de exemplu
DROP TABLE departament;
atunci existenta constrangerii de integritate referentiala va impiedica distrugerea tabelului, astfel incat la incercarea de a executa comanda de mai sus se va genera un mesaj de eroare. In astfel de situatii, tabelul trebuie distrus impreuna cu toate constrangerile FOREIGN KEY care fac referire la cheia primara a acestuia. Acest lucru se poate face prin folosirea comenzii SQL DROP TABLE cu clauza CASCADE CONSTRAINTS
DROP TABLE departament CASCADE CONSTRAINTS;
Executia comenzii de mai sus va duce la distrugerea tabelului departament si a constrangerii referentiale sal_dept_fk
In momentul in care un tabel este distrus, vor fi sterse automat si toate datele din tabel cat si indecsii asociati lui. Vederile si sinonimele asociate unui tabel care a fost distrus vor ramane dar vor deveni invalide.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1188
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved