Revista de Internet din oracolul rusesc, iulie - 2018

Extensii ale funcționalității constrângerilor de integritate declarativă în baza de date Oracle8

(Integritatea Oracle8-Îmbunătățiri Constrângeri, de Steve Bobrowski (68fast.html))







Utilizați îmbunătățirile Oracle8 pentru a oferi flexibilitate suplimentară și pentru a extinde funcționalitatea constrângerilor de integritate.

Constrângerile de integritate stabilite în tabelele bazei de date garantează coerența regulilor de date care asigură precizia și acceptabilitatea informațiilor. Fără constrângeri de integritate declarativă, stabilirea chiar și a celor mai simple reguli pentru date ar deveni o sarcină dificilă sau, în general, nepractică.

Oracle7 suportă diferite tipuri de constrângeri de integritate, printre care:

  • cheile primare și unice, pentru a asigura integritatea entității (întregul tabel);
  • Restricții nu sunt nul și verificați, pentru a asigura integritatea domeniilor (ariile de definiție);
  • cheile externe pentru a asigura integritatea referențială (a se vedea "Rezumatul constrângerilor de integritate").

În plus, Oracle7 include mai multe caracteristici suplimentare, de exemplu, activează și dezactivează constrângerile de integritate, după cum doriți. Implementarea constrângerilor de integritate Oracle7 a fost extinsă la Oracle8. Acest articol descrie utilizarea constrângerilor de integritate Oracle7, precum și trei îmbunătățiri semnificative în Oracle8.

1. Constrângeri de integritate "întârziate"

Oracle7 verifică fiecare interogare de date care modifică datele din tabel și verifică dacă datele satisfac toate constrângerile de integritate incluse. Verificarea imediată (imediată) a constrângerilor de integritate îngreunează punerea în aplicare a unor acțiuni efectuate de aplicații, de exemplu, "actualizări în cascadă". O actualizare în cascadă are loc atunci când valorile cheie ale intrărilor din tabelul principal sunt actualizate, pentru care există intrări detaliate. Pentru a menține relația dintre înregistrările primare și cele detaliate, actualizarea cheii primare ar trebui să ducă la actualizarea câmpurilor de chei străine în toate înregistrările detaliate aferente. Deoarece cheile primare nu sunt actualizate în majoritatea aplicațiilor, Oracle declarativ (adică, ca parte a definiției tabelului) nu acceptă actualizări în cascadă ale cheilor externe. Dar dacă este încă necesară abilitatea de a actualiza valorile cheii primare cu înregistrări detaliate dependente pentru ca aplicația să funcționeze, trebuie să implementați funcția de actualizare în cascadă utilizând mecanismul de declanșare a bazei de date, ca parte a aplicației. În caz contrar, primiți un mesaj de eroare:

În punerea în aplicare a Oracle7 funcționalitate de actualizare în cascadă poate fi o sarcină dificilă, deoarece serverul verifică datele pentru conformitatea cu toate restricțiile incluse în interogare, și a inclus Oracle7 constrângerile de integritate declarativă nu permit nici o neconcordanță temporară de date. O soluție ar putea fi implementarea următorului algoritm într-o aplicație:

  1. Dezactivarea cheii externe a tabelului detaliat.
  2. Actualizați valorile cheie primară în tabela de master.
  3. Actualizarea valorilor cheii străine corespunzătoare în tabelul detaliat.
  4. Activați din nou tasta străină pe tabelul detaliat.

Listarea 1 prezintă un exemplu de implementare a acestui algoritm pentru comenzile și clienții tabele (și clienții Comenzi). Deși această metodă rezolvă problema, este dificil de implementat. Aplicația trebuie să fie proiectată pentru a evalua momentul în care este necesar să se dezactiveze constrângerile de integritate dacă tranzacția efectuează o actualizare. Să adăugăm că aplicația nu trebuie să dezactiveze cheile externe în toate cazurile în care valoarea actualizată a cheii primare nu are înregistrări detaliate corespunzătoare. Această metodă nu numai că adaugă o complexitate considerabilă a cererii, dar această decizie nu este pur și simplu se aplică în multe cazuri, deoarece tabelul detaliat rămâne neprotejat de la introducerea de date incorecte pe tot timpul când cheia externă este dezactivată. Astfel, verificarea directă a constrângerilor de integritate în Oracle7 poate duce la apariția unor probleme solvabile dificile.

Pentru a reduce complexitatea, Oracle8 implementează o nouă caracteristică, descrisă în standardul ANSI / ISO SQL92, numită "verificări de integritate amânate". O constrângere de integritate amânată poate fi setată astfel încât să fie verificată la finalizarea tranzacției și nu când fiecare interogare SQL este executată. Constrângerile de integritate amânate vă permit să creați inconsecvențe temporare în datele pentru constrângerile de timp ale tranzacției. Cu toate acestea, atunci când tranzacția este comisă, datele trebuie să satisfacă toate constrângerile, în caz contrar Oracle8 o va întoarce. Această inovație simplifică implementarea actualizărilor în cascadă.

Pentru a determina constrângerile de integritate întârziate, în comenzile pentru crearea și modificarea definiției tabelului se utilizează cuvinte cheie noi. Noua capabilitate Oracle8 este disponibilă atunci când se definesc constrângerile de integritate, atât la nivel de coloană, cât și la nivel de tabel:

Trebuie să evaluați cu atenție fiecare dintre alternative și să alegeți comportamentul adecvat pentru aplicație. De exemplu, trebuie să creați o cheie străină pentru o tabelă detaliată și este necesară actualizarea cheii primare corespunzătoare. În acest caz, cheia externă este creată ca o constrângere de integritate amânată cu opțiunea INITIAL IMMEDIATE (inițial nu amânată).

Pentru a defini în mod explicit utilizarea uneia sau mai multor întârzieri în tranzacție, aplicația trebuie să înceapă tranzacția cu noua comandă SQL SET CONSTRAINT (sau SET CONSTRAINTS):

Sintaxa comenzii vă permite să specificați tipul de validare, atât pentru mai multe constrângeri definite, cât și pentru toate restricțiile care pot fi în interogările SQL ale acestei tranzacții. Dacă una sau mai multe restricții sunt amânate în tranzacție, puteți utiliza comanda SET CONSTRAINTS ALL IMMEDIATE înainte de a efectua tranzacția curentă pentru a verifica în prealabil baza de date pentru respectarea constrângerilor în așteptare:

  • Dacă comanda a avut succes, atunci modificările efectuate de tranzacție satisfac toate constrângerile în așteptare și puteți finaliza cu succes tranzacția.
  • În cazul în care a apărut o eroare în timpul executării comenzii, modificările efectuate de tranzacție au dus la apariția datelor care nu satisfac una sau mai multe restricții în așteptare. Pentru a comite cu succes o tranzacție, trebuie să efectuați modificări suplimentare la baza de date, astfel încât datele să nu contravină constrângerilor amânate și să efectuați o nouă încercare cu comanda SET CONSTRAINTS ALL IMMEDIATE. Dacă acest lucru nu se face, atunci când tranzacția este finalizată, Oracle va răsturna modificările făcute de acesta.






Problema menționată anterior a actualizărilor în cascadă este un bun exemplu de utilizare adecvată a constrângerilor întârziate. Mai întâi, trebuie să definiți tabelul ORDERS cu cheia externă pe tabela CUSTOMERS, ca o constrângere de integritate amânată pe care Oracle8 o va verifica în mod implicit:

Când se folosește constrângerea de integritate întârziată, algoritmul de actualizare în cascadă este extrem de simplu:

Amânată pentru un tabel detaliat al unei integritate străine constrângere cheie nu numai că simplifică în cascadă actualizări, dar vă permite să protejeze datele (pentru că nu este nevoie să dezactivați constrângerea de integritate, iar datele schimbare de tranzacții competitive vor fi verificate imediat pentru a îndeplini condițiile impuse amână restricții).

2. Indici non-unici pentru cheile primare și unice

În mod implicit, când se creează o cheie primară sau unică pe o masă, atât Oracle7 cât și Oracle8 creează un index unic pentru a susține fiecare constrângere de integritate. De exemplu, comanda CREATE TABLE anterioară creează nu numai o tabelă ORDERS, ci un index (PKEY_ ORDERS) pentru a susține cheia primară declarată.

Dacă nu planificați o închidere frecventă și apoi includeți o cheie primară sau unică, pare să fie cea mai bună soluție folosirea unui index unic creat implicit. Cu toate acestea, acest lucru poate cauza dificultăți dacă se face deschiderea și închiderea periodică a constrângerilor (cel mai adesea dezactiva constrângeri de integritate înainte de a descărca cantități mari de date într-un tabel, de exemplu, în stocarea datelor). Monitorizarea constrângerilor de integritate la încărcarea unor cantități mari de date reduce semnificativ performanța. Dacă îl excludeți, puteți crește semnificativ viteza de descărcare. După încărcare, pentru a determina înregistrările care nu respectă constrângerile de integritate incluse, puteți utiliza abilitatea de a primi un raport de excepție.

Din păcate, atunci când se lucrează cu mai multe gigabytes în tabele de dimensiuni, de deconectare și reconectare a cheilor primare sau străine poate fi inacceptabil modul în care Oracle7, Oracle8 îndepărtat și indicele unic corespunzător, pe care serverul îl folosește pentru a sprijini constrângerile de integritate. Acest lucru înseamnă că, dacă reactivați constrângeri după încărcarea datelor, baza de date va trebui să re-crea indexul unic corespunzător, care poate dura ore pentru mese mari.

În plus, o blocare exclusivă este plasată pe masă pentru întreaga perioadă în care indicele este recreat, ceea ce face tabela indisponibilă pentru schimbări competitive de date și alte operații.

Oracle8 permite utilizatorului să creeze singuri un indice non-unic pentru a suporta o cheie primară sau unică. În loc să permiți serverului să creeze automat un index, îl puteți crea singur pentru o constrângere de integritate dezactivată. Apoi, când restricția este re-activată, Oracle8 va folosi acest index. Următoarele comenzi demonstrează utilizarea acestei caracteristici a Oracle8.

Acum, dacă dezactivați cheia primară a tabelului ORDERS, indicele PKEY_ORD_ID va rămâne. Solicitările care vor fi executate în momentul în care restricția este dezactivată vor putea utiliza acest index. În plus, dacă reactivați cheia primară, indicele va exista deja, iar DBMS nu va trebui să-l reconstruiască de la zero, ceea ce va accelera semnificativ operațiunea.

3. Restricționarea imediată a restricțiilor

Pentru a accelera includerea constrângerii de integritate cu handicap, Oracle8 a extins funcționalitatea clauzei CONSTRAINT a comenzii ALTER TABLE:

În mod implicit, sau când este specificat cuvântul cheie VALIDATE, Oracle8 verifică integritatea tuturor datelor din tabel înainte de a activa constrângerea (este la fel ca și Oracle7).

Pentru a verifica integritatea tuturor tabelelor de date, de Oracle8 impune o blocare exclusivă (Exclusiv Lock) pe masa, care nu numai că permite o actualizare competitivă a datelor pe durata testării, dar vă permite să includă doar o singură constrângere la un moment dat. Atunci când lucrați cu mese mari, reactivând una după alta toate constrângerile de integritate după încărcarea în lot a unor cantități semnificative de date poate dura mult timp.

Dacă includeți o constrângere cu cuvântul cheie NOVALIDATE, Oracle8 nu verifică datele din tabel pentru respectarea constrângerii de integritate. Astfel, Oracle8 poate activa imediat verificările de integritate pentru tranzacțiile ulterioare. După includerea tuturor restricțiilor pe masă, puteți utiliza aceeași comandă cu cuvântul cheie VALIDAT pentru a traduce fiecare constrângere într-o stare "verificată". Traducerea din starea "verificat" la "verificat" nu necesită blocarea exclusivă a tabelului, astfel încât tabelul continuă să susțină tranzacțiile competitive. În plus, în Oracle8, procesarea internă paralelă este utilizată pentru a accelera validarea datelor pentru a respecta constrângerea. Următoarea secvență de comandă demonstrează cum puteți activa în mod optim constrângerea de integritate cu handicap:

concluzie

Extensiile la funcționalitatea constrângerilor declarative de integritate Oracle8 pot îmbunătăți calitatea datelor și pot simplifica dezvoltarea aplicațiilor bazei de date.

  • Puteți crea constrângeri de integritate în așteptare și, apoi, amâna validarea acestora până la sfârșitul tranzacției cu noua comandă SQL SET CONSTRAINTS. Abilitatea de a amâna verificarea condițiilor de constrângere facilitează punerea în aplicare a unor astfel de cerințe ale sistemelor complexe de procesare a datelor, cum ar fi actualizările în cascadă.
  • Puteți consolida cheile primare și unice creând indicele corespunzător non-unic. Când dezactivați această restricție, Oracle8 nu va șterge indexul, ceea ce va accelera includerea restricției.
  • Puteți să activați constrângerea într-o stare "neconfirmată" pentru a verifica imediat constrângerile pentru modificarea datelor și pentru a permite actualizărilor competitive ale datelor din tabel. Mai târziu, puteți activa constrângerea de integritate în starea "verificat" pentru a vă asigura că toate datele din tabel sunt satisfăcute.

Privire de ansamblu asupra constrângerilor de integritate

Verificați: Acest tip de constrângere de integritate este utilizat pentru a specifica un set acceptabil de valori ale coloanelor (domeniu) sau de mai multe coloane dintr-un tabel. În acest fel, puteți specifica mai complexe reguli de integritate. De exemplu, puteți defini o constrângere pe masa clienților care permite introducerea abrevieri numai acceptabile de numele țărilor în statul este o coloană sau pe masa de ordine care permite introducerea codurilor valide numai în coloana de stare. constrângere de integritate este definită folosind SQL-comenzi și este o expresie logică care Oracle ar putea fi calculată pentru fiecare înregistrare din tabel, folosind doar valorile câmpurilor de aceeași înregistrare. Expresia booleană ar trebui să fie relativ simplă: nu poate conține tabele sau interogări la secvența și nu pot conține apeluri de funcții SQL: SYSDATE, UID, USER sau Userenv. Atunci când expresia logică pentru o înregistrare dată este True sau UNKNOWN, înregistrarea este considerată a satisface constrângerea.

Not Null: Valoarea Null este adesea folosită incorect. În mod prestabilit, orice coloană din tabel poate conține valori nedefinite. În coloana tabelului, poate fi definită o constrângere pentru a exclude incertitudinea din domeniul coloanei, împiedicând astfel apariția unor valori nedefinite în coloană.

Cheia primară: Constrângerea de integritate Cheia primară a tabelului este destinată să asigure integritatea entității (întregul tabel), asigurându-se că nu există mai multe înregistrări identice în tabel. Pentru aceasta, cheia primară asigură faptul că tabelul nu are valori duplicate în coloana sau grupul de coloane care alcătuiesc cheia. Pentru o masă, se poate defini o singură cheie primară.

Tastă unică: o cheie unică, numită și o cheie alternativă, împiedică apariția valorilor duplicate în coloanele care alcătuiesc cheia. Pe masă, există cât mai multe chei unice, cu condiția ca fiecare să fie alcătuită din grupuri de coloane disjuncte.

Tasta străină: Cheia externă (altfel constrângerea de integritate referențială) oferă relația dintre coloanele și tabelele din baza de date relațională. Integritatea referențială asigură că fiecare valoare a cheii externe se potrivește cu valoarea cheii principale corespunzătoare. O cheie străină este o coloană a unui tabel detaliat care se referă la o cheie primară sau unică din tabela master (master). Tipurile acestor chei trebuie să se potrivească.







Trimiteți-le prietenilor: