ALTE DOCUMENTE
|
||||||
O problema critica în gestionarea bazelor de date este asigurarea respectarii unui set predefinit de reguli de catre datele bazei de date. Aceste reguli trebuie sa fie în concordanta cu activitatile comerciale pe care le sustine sistemul. Administratorul bazei de date, programatorul aplicatiei si'reprezentantul de zona sunt responsabili pentru definirea si crearea acestor reguli.
În esenta, integritatea datelor presupune definirea regulilor care restrâng valorile valide pentru o coloana a unui tabel. Restrictiile de integritate sunt definite pentru tabele si prin urmare toate vederile si sinonimele tabelelor sunt supuse restrictiilor de integritate. Daca o instructiune DML încearca sa efectueze o actiune care violeaza o restrictie de integritate, este generata o eroare si tranzactia este derulata înapoi.
Restrictiile de integritate a datelor reprezinta mijloacele utilizate de programul Oracle pentru a preveni introducerea datelor invalide în tabelele bazei de date. Aceste restrictii de integritate sunt definite pentru a impune respectarea regulilor comerciale care sunt asociate cu informatiile din baza de date. Programul Oracle nu permite încalcarea acestor reguli, asigurând astfel integritatea datelor.
Diversele tipuri de restrictii de integritate va permit sa personalizati si sa modelati baza dumneavoastra de date în concordanta cu specificul activitatii companiei dumneavoastra. Acest capitol prezinta diversele tipuri de restrictii de integritate.
Restrictiile de integritate sunt definite asupra tabelelor bazei de date. Vederile si sinonimele tabelelor sunt supuse restrictiilor de integritate definite asupra tabelelor de baza. în acest capitol sunt trecute în revista tipurile de restrictii de integritate si modul de utilizare a lor.
Este recomandabil sa definiti regulile de integritate a datelor în baza de date si nu în aplicatii. Este mai eficient sa o faceti la nivelul bazei de date decât sa creati rutinele echivalente în aplicatia dumneavoastra. Unul dintre motivele principale pentru a face acest lucru la nivelul bazei de date este faptul ca integritatea datelor la acest nivel asigura performante maxime în ceea ce priveste viteza. De asemenea, toate aplicatiile pot beneficia de aceste restrictii globafe, deci nu este necesar sa repetati structurile logice echivalente în fiecare aplicatie.
Toate restrictiile au un nume. Puteti denumi o restrictie în timp ce o creati. Daca nu o faceti, programul Oracle îi va atribui un nume. Numele furnizat de utilizator trebuie sa fie diferit de toate celelalte restrictii care va apartin.
În baza de date relationala Oracle, exista urmatoarele tipuri de restrictii de integritate a datelor:
Nuli
Unique
Primary key
Referential
Check
Restrictia de integritate pentru un tabel este stabilita atunci când tabelul este creat sau modificat. Pentru a stabili o restrictie de integritate, puteti include clauza constraint în comenzile create table sau alter table. Exemplul urmator ilustreaza sintaxa generala a clauzei constraint:
CONSTRAINT nume_restrictie tip_restrictie
Tipurile de restrictii sunt tratate în paragrafele care urmeaza.
In mod prestabilit, toate coloanele unui tabel accepta valori nule. Cu alte cuvinte, este permisa absenta unei valori în orice coloana. Prin stabilirea restrictiei de integritate not nuli impuneti coloanei specificate sa posede o valoare pentru fiecare linie a tabelului.
Instructiunea urmatoare creeaza un tabel în care coloana nume este definita cu restrictia de integritate not nuli. Aceasta înseamna ca pentru fiecare linie adaugata tabelului trebuie sa existe o valoare pentru coloana nume.
Create table ang
(marca_ang number(7),
nume varchar2(20)
constraint s_ang_nume_nn not nuli,
prenume varchar2(20),
nr_dept varchar2(5));
Pentru a afisa restrictiile nuli dintr-un tabel, folositi comanda describe. Comanda describe care urmeaza, afiseaza toate restrictiile not nuli din tabelul ANG.
DESCRIBE ang
Date de iesire:
Name |
NULL? |
Type |
marca ang |
NUMBER(7) |
|
Nume |
NOT NULL |
VARCHAR2 (20) |
Prenume |
VARCHAR2 (20) |
|
nr dept |
VARCHAR2 ( 5 ) |
Aceasta restrictie de integritate impune ca toate valorile dintr-o coloana sa fie distincte. Nu pot exista valori duplicate într-o coloana care are restrictia de integritate unique. Coloana definita de restrictia unique este cunoscuta sub numele de coloana cu cheie unica. Oracle va permite sa plasati aceasta restrictie pe mai multe coloane, definind astfel o asa numita restrictie de unicitate compusa.
O restrictie de unicitate compusa cere ca o combinatie a coloanei cu cheie unica sa nu se repete.
Instructiunea urmatoare creeaza o restrictie de unicitate asupra coloanei marca_ang a tabelului ANG:
create table ang
(marca_ang number(7)
constraint s_ang_marca_ang_uk unique,
nume varchar2(20)
constraint s_ang_nume_nn not nuli,
prenume varchar2(20),
nr_dept varchar2(5));
In exemplul anterior a fost folosita comanda describe pentru a confirma restrictia de integritate nuli. In schimb pentru a afisa alte tipuri de restrictii definite pentru un tabel, trebuie sa folositi o alta abordare. Consultati paragraful "Afisarea restrictiilor de integritate" care urmeaza ceva mai târziu în acest capitol pentru a vedea care sunt metodele de confirmare a restrictiilor unui tabel.
Restrictia de integritate unique este respectata de coloanele cu valori nule deoarece toate valorile nule sunt considerate unice si distincte din punctul de vedere al acestei restrictii în consecinta, e,ste recomandabil sa plasati restrictia not nuli pe coloanele cu valori unice în acest fel fortati introducerea unei valori pentru coloana respectiva si va asigurati ca valoriie sunt cu adevarat distincte în declaratia tabelului urmator sunt adaugate restrictiile unique si not nuli pe coloana marca_ang:
create table ang
(marca_ang number(7)
constraint s_ang_marca_ang_uk unique
constraint s_ang_marca_ang_nn not nuli,
nume varchar2(20)
constraint s_ang_nume_nn not nuli,
prenume varchar2 (20) ,
nr_dept varchar2(5));
Restrictia de integritate primary key desemneaza o coloana sau o combinatie de coloane drept cheie principala a tabelului. Cheia principala identifica în mod univoc fiecare linie a tabelului. De asemenea, aceasta restrictie creeaza în mod implicit restrictiile not nuli si unique pe coloana respectiva. Desi Oracle nu impune existenta unei chei principale pentru fiecare tabel, este bine sa va obisnuiti sa o creati. De asemenea, este recomandabil sa desemnati drept cheie principala o coloana sau o combinatie de coloane ale caror valori nu se modifica niciodata.
Instructiunea urmatoare creeaza o restrictie primary key pentru câmpul marca_ang al tabelului ANG:
create table ang
(marca_ang number(7)
constraint s_ang_marca_ang_pk primary key,
nume varchar2(20)
constraint s_ang_nume_nn not nuli,
prenume varchar2 (2()) ,
nr_dept varchar2(5));
Pentru a crea restrictii asupra tabelelor, puteti folosi o a doua sintaxa, cunoscuta sub numele de sintaxa restrictie_tabel. Cu aceasta sintaxa, restrictiile sunt plasate la baza instructiunii create table. Exemplul urmator creeaza acelasi tabel ca în exemplul anterior, folosind sintaxa restrictie_tabel:
create table ang
(marca_ang number(7),
nume varchar2(20),
prenume varchar2(20),
nr_dept varchar2(5),
constraint s_ang_marca_ang_pk primary key (marca_ang));
Sistemul Oracle impune existenta a maxim o cheie principala pentru fiecare tabel. Cheia principala nu poate fi de tip long sau long raw. Nu puteti desemna aceeasi coloana sau combinatie de coloane atât drept cheie principala cât si drept cheie'unica sau atât drept cheie principala cât si drept cheie de grup. Daca încercati sa faceti acest lucru, programul Oracle genereaza o eroare.
Exemplul urmator adauga o cheie principala compusa pe coloanele nume si prenume ale tabelului ANG:
alter table ang
add primary key
(nume, prenume);
alter table ang enable primary key
Restrictiile de integritate prin referinta sunt folosite pentru a impune regulile comerciale care dicteaza relatiile dintre coloanele diverselor tabele. Cu acest tip de restrictie, între tabele se creeaza o relatie parinte-fiu. Tabelul parinte contine cheia referita iar tabelul fiu contine cheia externa.
De exemplu, sa presupunem ca aveti un tabel parinte care contine o lista de 50 de state. Tabelul fiu poate fi un tabel de adrese care contine numele si adresa cunoscutilor dumneavoastra Tabelul de adrese are o restrictie priri referinta care stabileste ca singurele adrese valide sunt cele în care statul se regaseste în tabelul parinte de state. Daca încercati sa adaugati o noua adresa în care prescurtarea statului este ZZ, inserarea va esua deoarece ZZ, nu exista printre cele 50 de state ale tabelului parinte. Exemplul urmator creeaza aceasta restrictie de integritate prin referinta asupra tabelului de adrese:
alter table adrese add constraint fk_abr_stat foreign key (abr_stat) references abr_stat(abr_stat) ;
Iata o lista a principalilor termeni folositi la stabilirea unei restrictii de integritate prin referinta:
Cheie externa |
Coloana sau setul de coloane incluse în definitia restrictiei de integritate prin referinta |
Cheie referita |
Cheia unica sau cheia principala a aceluiasi tabel sau a unui alt tabel la care face referire cheia externa |
Tabel dependent |
Tabelul care contine cheia externa |
Tabel referit |
Tabelul care este referit de cheia externa |
Sistemul Oracle impune câteva restrictii în legatura cu manipularea cheilor prin referinta. Nu puteti sa modificati sau sa eliminati cheia referita daca cheia rezultanta ar viola restrictiile de integritate prin referinta. De exemplu, nu puteti elimina o valoare a cheii referite deoarece acest lucru ar duce la violarea restrictiilor prin referinta. Totusi, puteti elimina valorile cheii referite daca nu exista nici o linie dependenta.
Exista totusi cazuri când este întradevar necesar sa eliminati o valoare a cheii referite. Atunci când nu exista valori ale cheii externe care sa faca referire la valoarea respectiva, puteti elimina fara probleme valoarea cheii referite. De cele mai multe ori însa, exista linii având asociata restrictia f oreign key care va împiedica sa eliminati valoarea cheii referite.
Pentru a rezolva aceasta problema, stabiliti asupra cheii referite restrictia on delete cascade. Restrictia on delete cascade permite eliminarea din tabelul parinte a oricaror valori ale cheii referite care au Unii dependente în tabelul fiu. Atunci când este eliminata o asemenea valoare în tabelul parinte, programul Oracle elimina automat liniile corespunzatoare din tabelul fiu.
Restrictia de integritate check defineste în mod explicit o conditie care trebuie sa fie adevarata. Pentru a satisface aceasta restrictie, fiecare linie a tabelului trebuie sa respecte conditia. Conditia poate fi evaluata si la valoarea Unknown pentru a permite prezenta valorii nuli. Daca se încearca executarea unei instructiuni care ar duce la nerespectarea conditiei, instructiunea este derulata înapoi.
Restrictia check prezinta urmatoarele limitari:
Nu poate sa contina subinterogari
Nu poate sa contina functiile sysdate, uid, user si userenv
Nu poate utiliza pseudo-coloanele currval, nextval, level si rownum
Exemplul urmator creeaza o restrictie check asupra coloanei oras din tabelul adresa_filiala:
create table adresa_filiala
(nr_filiala number(5),
nume_filiala varchar2(50),
oras varchar2(50)
constraint verificare_oras
check oras in ( "Dallas'", "Denver", "Indianapolis") ,
stat varchar2(50));
Nu exista nici o limitare în legatura cu numarul de restrictii check permise pe o coloana. O singura coloana poate avea mai multe restrictii check.
în paragrafele anterioare, a fost utilizata comanda describe pentru afisarea restrictiilor nuli impuse coloanelor. Tabelul USER_CONSTRAINTS contine informatii complete despre toate restrictiile impuse unui tabel.
În continuare sunt prezentate coloanele tabelului USER_CONSTRAINTS:
owner |
Utilizatorul care este proprietarul definitiei restrictiei. |
constraint_name |
Numele definitiei restrictiei. |
constraint_type |
Tipul restrictiei. Tipurile sunt C pentru check, P pentru cheie principala, U pentru cheie unica si R pentru cheie externa. |
table name |
Numele tabelului asociat cu definitia restrictiei. |
search condition |
Textul conditiei de cautare pentru o conditie check. |
r_owner |
Proprietarul tabelului la care se face referire într-o restrictie prin referinta. |
r_constraint names |
Numele restrictiei de integritate primary key pentru coloana referita de o restrictie prin referinta. |
delete rule |
Modul de tratare a cheilor externe care fac referire la o cheie principala sau la o cheie unica eliminate. Cele doua optiuni sunt delete cascade si no action |
status |
Valoare utilizata intern de serverul Oracle. |
Pentru a afisa restrictiile asociate unui anumit tabel, efectuati o operatiune select: asupra tabelului USER_CONSTRAINTS pentru tabelul vizat be exemplu, instructiunea urmatoare afiseaza restrictiile asociate tabelului LST_ARTICOLE:
select constraint_name "Nume"
constraint_type "Tip"
from user_constraints
where table_name = 'lst_articole';
Date de iesire:
Nume |
Tip |
S_COD_ARTICOLE_FK |
R |
S_NR_ARTICOLE_UK |
U |
S_ID_ARTICOLE_PK |
P |
Tabelul USER_CONS_COLUMN va furnizeaza informatii suplimentare în legatura cu restrictiile impuse unui tabel în continuare sunt prezentate coloanele tabelului USER_CONS_COLUMN:
owner |
Utilizatorul care este proprietarul definitiei restrictiei. |
constraint_name |
Numele definitiei restrictiei. |
table_name |
Numele tabelului asociat cu definitia restrictiei. |
column_name |
Numele coloanei specificate în definitia restrictiei. |
position |
Pozitia initiala a coloanei în definitia restrictiei. |
Instructiunea urmatoare afiseaza informatiile referitoare la restrictiile impuse coloanelor tabelului CLIENt
select constraint_name "Restrictie",
column_name "Coloana"
froin iiser_cons_column where table_name = "client";
Date de iesire:
Restrictie |
Coloana |
S_CLIENT_ID_PK |
CLIENT ID |
S_ZONA_VANZARI_CLIENT_FK |
ZONA_VANZARI |
Pentru a obtine asistenta la depanarea exceptiilor de la restrictii, includeti optiunea exceptions în clauza enable a comenzilor create 'table sau a'lter table. Optiunea exceptions depune identificatorul liniei (rowid), proprietarul tabelului, numele tabelului si numele restrictiei, pentru toate liniile care fac exceptie de la restrictii, într-un tabel predefinit EXCEPTIONS. Sistemul Oracle dispune de un script, numit utlexcpt. sql, care creeaza tabelul EXCEPTIONS.
Instructiunea urmatoare modifica un tabel si adauga o noua restrictie cu optiunea exceptions:
alter table personal,
enable primary key
exceptions into exceptions;
Odata creat tabelul EXCEPTIONS, puteti efectua asupra lui o operatie de selectare pentru a obtine liniile care violeaza o anumita restrictie. Exemplul urmator foloseste ojeuniune pentru a afisa liniile de date care intra în conflict cu regulile tabelului în acest exemplu, în tabelul DEPT exista o valoare duplicata a cheii unice.
Select nr_dept, nume_dept, dir_dept from dept, exceptions
where exceptions-constraint = "s nume_dept_uk"
and dept.rowid = exceptions.row_Td;
Date de iesire:
NR_DEPT |
NUME_DEPT |
DIR_DEPT |
Ambalare Ambalare |
Riley Riley |
O restrictie de integritate definita asupra unui tabel se poate afla în doua stari: activa si inactiva. Atunci când o restrictie este activa, este impusa respectarea regulilor stabilite în definitia restrictiei. Atunci când restrictia este inactiva, nu este impusa respectarea acestor reguli.
Daca se încearca activarea unei restrictii asupra unui tabel care nu respecta regulile restrictiei de integritate, programul Oracle genereaza o eroare de exceptie iar instructiunea în cauza este derulata înapoi. Daca exista o exceptie, nu puteti activa restrictia pâna când exceptia nu este actualizata sau eliminata
Pentru activarea si dezactivarea restrictiilor se folosesc comenzile create table si alter table. Exemplul urmator dezactiveaza exceptiile impuse tabelului LST_ARTICOLE:
alter table lst articole
disable constraTnt s_cod_articole_fk;
Exista momente când este cu adevarat necesara dezactivarea temporara a restrictiilor. Acest lucru este necesar pe parcursul încarcarii datelor prin intermediul SQL*Loader si pe parcursul proceselor de import si export în ambele cazuri, dezactivarea temporara a restrictiilor poate îmbunatati eficienta operatiei.
Toate informatiile referitoare la restrictiile de integritate sunt stocate în dictionarul de date. Sistemul Oracle va pune la dispozitie mai multe vederi pe care le puteti folosi pentru a vedea definitiile curente ale restrictiilor de integritate din dictionarul de date. Aceste vederi sunt urmatoarele:
all_constraints |
Definitiile restrictiilor pentru toate tabelele accesibile |
all_cons_columns |
Informatii în legatara cu coloanele accesibile care apar în definitiile restrictiilor |
user_constraints |
Definitiile restrictiilor asociate tabelelor utilizatorului |
user_cons_columns |
Informatii în legatara cu coloanele care apar în definitiile restrictiilor apartinând utilizatorului |
dba_constraints |
Definitiile restrictiilor pentru toate tabelele bazei de date |
dba_cons_columns |
Informatii în legatara cu toate coloanele care apar în definitiile restrictiilor |
Pentru a distrage o restrictie de integritate, lansati comanda alter table cu clauza drop. In instructiunea urmatoare, este distrusa restrictia din tabelul
lst_articole:
alte"r table lst_articole
drop constraint s cod articole fk;
Integritatea datelor asigura respectarea de catre baza de date a unui set predefinit de reguli stabilite de administratorul bazei de date si de programatorul aplicatiei. Atât administratorul cât si programatorul preiau aceste reguli din zona de activitate a companiei pe care o sustine baza de date. Practic, activitatea comerciala este cu adevarat cea care impune si defineste integritatea datelor.
Integritatea datelor si restrictiile de integritate sunt mecanismele folosite de serverul Oracle pentru a preveni introducerea datelor invalide în baza de date. Aceste restrictii asupra datelor asigura respectarea cu strictete a regulilor companiei.
În acest capitol, ati facut cunostinta cu diverse tipuri de restrictii de integritate si ati învatat sa le aplicati la nivel'de tabel. De asemenea, au fost prezentate modurile de gestionare a restrictiilor.
|