Sunteți pe pagina 1din 12

Capitolul 2 - Baze de date active

„ Funcţia de activare din sistemele informatice: modificarea stării


domeniului; necesară în sistemele complexe
„ Ex: înscrierea unui nou cursant necesită adăugarea adresei acestuia în lista
de adrese în care opreşte autobusul care transportă cursanţii
„ În sistemele “tradiţionale” (pasive):
„ funcţia de activare inclusă în programele de aplicaţie: acestea execută un
polling în lista cursanţilor, descoperă un cursant nou şi inserează adresa
„ probleme: frecvenţa de polling greu de optimizat
„ În bazele de date active:
„ Migrarea funcţiei reactive de la aplicaţie către baza de date
„ În exemplul dat, la inserarea unui nou cursant un trigger adaugă adresa
acestuia în lista de adrese
„ Avantajele sistemelor active:
„ Eficienţa execuţiei (nu se mai consumă timp pentru polling)
„ Reutilizabilitatea codului – toate aplicaţiile pot folosi ac. funcţie de activare
Prof. Felicia Ionescu Cap. 2 - Baze de date active 1
Analiza şi proiectarea
comportării active a bazei de date
„ Analiza Æ identificarea cerinţelor aplicaţiilor d.p.v al utilizatorilor
„ modelul conceptual al comportării (behavior) bazei de date
„ comportarea bazei de date se defineşte prin proceduri stocate, funcţii
definite de utilizator şi triggere (în special triggere)
„ Proiectarea Ædefinirea regulilor de activare (active rules)
„ O regulă de activare (active rule) conţine 3 elemente:
„ Evenimentul (event) Æ evenimentul care poate provoca o acţiune (tipic
operaţii de insert, update, delete în tabelele bazei de date)
„ Condiţia (condition) Æo expresie logică care condiţionează execuţia acţiunii
„ Acţiunea (action) Æun bloc de program care specifică răspunsul la apariţia
evenimentului, dacă condiţia este evaluată la valoarea true; tipic, acţiunea
modifică baza de date sau comunică unele informaţii către utilizatori
„ Implementarea Æ în sistemele de baze de date relaţionale comportarea
activă se obţine prin utilizarea triggerelor

Prof. Felicia Ionescu Cap. 2 - Baze de date active 2


Comportarea activă
„ Comportarea activă depinde de:
„ Momentul activării acţiunii (cuplarea evenimentului cu acţiunea):
„ Cuplare imediată (immediate): atunci când se declanşează un eveniment
asociat regulii r1, tranzacţia care a declanşat acel eveniment este
suspendată, şi se începe execuţia acţiunii asociate lui r1; dacă acestă
acţiune declanşează un alt eveniment, asociat regulii r2, acţiunea regulii r1
se suspendă, se prelucrează regula r2, apoi se completează regula r1; pot
exista mai multe imbricări, cu modul de execuţie lifo (last in, first out)
„ Cuplare amânată (deferred): când este declanşat un eveniment al unei
reguli, ea este memorată într-o coadă care este prelucrată mai târziu, tipic
după terminarea tranzacţiei
„ Modul de gestionare a evenimentelor multiple:
„ Pentru modul de cuplare imediat: se activează acţiunea regulii după fiecare
eveniment asociat regulii respective – granularitate la nivel de tuplu (linie)
„ Pentru modul de cuplare cu amânare: în mod tipic se activează acţiunea
regulii după ce s-au declanşat toate evenimentele regulii respective –
granularitate la nivel de instrucţiune (statement)

Prof. Felicia Ionescu Cap. 2 - Baze de date active 3


Standardizarea comportării active în SQL’99
„ Majoritatea producătorilor de BD relaţionale în versiuni actuale includ
triggere conform specificaţiilor standardului SQL’99
„ Sintaxa instrucţiunii de creare a unui trigger în SQL’99:
CREATE TRIGGER trigger_name Ænumele triggerului
{BEFORE | AFTER} Æmomentul declanş.
{[DELETE] | [INSERT] | [UPDATE] [OF column [,...n]} ON table_name Æevenimentul
[REFERENCING {OLD [ROW] [AS] old_name | NEW [ROW] [AS] new_name
OLD TABLE [AS] old_name | NEW TABLE [AS] new_name}] Ætabele temporare
[FOR EACH { ROW | STATEMENT }] Ægranularitatea
[WHEN (conditions)] Æcondiţia
code block Æacţiunea
„ Caracteristici triggere SQL’99:
„ fiecare trigger are un nume (trigger_name);
„ evenimentul de declanşare: una din instrucţiunile de modificare a datelor
DELETE, INSERT, UPDATE executate intr-un tabel dat prin numele său
(table_name); (pentru UPDATE se poate specifica coloana modificată)
„ momentul declanşării: înainte (BEFORE) sau după (AFTER) instr. respectivă
Prof. Felicia Ionescu Cap. 2 - Baze de date active 4
Caracteristicile triggerelor SQL’99
„ Implicit, un trigger se declanşează o dată (la nivel de instrucţiune)
„ Selecţia explicită a granularităţii:
„ FOR EACH ROW: la nivel de linie (cu cuplare imediată)
„ FOR EACH STATEMENT: la nivel de instrucţiune (cu cuplare amânată)
„ Pentru transmiterea informaţiilor către trigger se folosesc tabelele
temporare NEW şi OLD, care au aceeaşi schemă ca şi tabelul dat
„ pentru triggerele declanşate de INSERT sunt vizibile datele nou introduse în
tabelul (linia) temporar NEW
„ pentru triggerele declanşate de DELETE sunt vizibile datele vechi în tabelul
temporar OLD
„ pentru triggerele declanşate de UPDATE sunt vizibile atât datele vechi
(OLD) cât şi noi (NEW)
„ Triggerele definite în diferite SGBD-uri prezintă variaţii faţă de aceste
caracteristici din standardul SQL’99

Prof. Felicia Ionescu Cap. 2 - Baze de date active 5


Caracteristicile triggerelor Oracle
„ Sintaxa Oracle pentru crearea unui trigger:
CREATE [OR REPLACE] TRIGGER [owner.]trigger_name
{BEFORE | AFTER | INSTEAD OF}
{[DELETE] [OR] [INSERT] [OR] [UPDATE [OF column [,...n] ]] [...n]}
ON {table_name | view_name}
[REFERENCING {OLD [AS] old_name | NEW [AS] new_name}]
[FOR EACH { ROW | STATEMENT }]
[WHEN (conditions)]
PL/SQL block
„ Opţiunea INSTEAD OF este admisă numai pentru vederi (views)
„ Acţiunea este specificată printr-un bloc PL/SQL, care este limbajul
procedural de extensie a limbajului SQL pentru sistemele Oracle

Prof. Felicia Ionescu Cap. 2 - Baze de date active 6


Aplicaţii ale comportării active a bazelor de date
„ Menţinerea (actualizarea) valorilor datelor derivate
Ex: salariul total se actualizează ori de cate ori se modifică salariul unui angajat
„ Impunerea unor constrângeri de integritate
„ Implementarea unor funcţiuni specifice domeniului (business rules)
„ În toate aceste situaţii se definesc reguli de activare (eveniment,
condiţie, acţiune – ECA rules)
„ Exemplu de comportare activă: impunere a unor reguli specifice

„ Fie o bază de date relaţională pentru


înscrierea studenţilor la cursuri,
distribuite în diferite săli
„ Pentru fiecare tip de entitate (curs,
sală, participant) Æ câte o relaţie
(tabel)
„ Asocierile de tip M:N (înregistrare -
enrollment şi distribuţie - distribution)
se modelează prin tabele suplimentare

Prof. Felicia Ionescu Cap. 2 - Baze de date active 7


Impunerea unor reguli specifice (1)

„ Proiectul logic al bazei de


date pentru inregistrarea
studentilor pentru sistemul
Oracle 11g R1, realizat in
MySQL Workbench Modeler
(Oracle SQL Developer
Data Modeler nu merge
prea bine)

Prof. Felicia Ionescu Cap. 2 - Baze de date active 8


Impunerea unor reguli specifice (2)
„ Definirea regulii
„ Ex: “numărul de participanţi la un curs nu poate să depăşească capacitatea
(numărul de locuri) sălii în care este planificat (distribuit) cursul”
„ Definirea evenimentelor care pot viola regula dată; ex:
„ înscrierea unui student la un curs (insert în enrollment)
„ modificarea sălii unui curs (update în distribution)
„ Definirea condiţiei de activare
„ numărul de participanţi la un curs mai mare decât capacitatea sălii în care
este distribuit cursul
„ Definirea politicii de impunere a regulii:
„ Se alege una dintre acţiunile posibile:
se limitează înscrierile la cursul respectiv
se planifică (distribuie) o altă sală
se împarte cursul în două sau mai multe săli
„ Implementarea acţiunilor printr-unul sau mai multe triggere

Prof. Felicia Ionescu Cap. 2 - Baze de date active 9


Impunerea unor reguli specifice (3)
„ Se proiecteza un trigger care sa limiteze inscrierea studentilor la un
curs, daca se depaseste capacitatea salii în care a fost distribuit cursul:
CREATE OR REPLACE TRIGGER LIMIT_ENROLMENTS
BEFORE INSERT ON ENROLMENT FOR EACH ROW
DECLARE
nr_stud integer; room varchar2(8); room_capacity integer;
BEGIN
SELECT COUNT (*) INTO nr_stud FROM ENROLMENT e
WHERE e.COURSE_ID = :NEW.COURSE_ID GROUP BY e.COURSE_ID;
SELECT ROOM_ID INTO room FROM DISTRIBUTION d
WHERE d.COURSE_ID = :NEW.COURSE_ID;
SELECT capacity INTO room_capacity FROM ROOMS r WHERE r.ROOM_ID = room;
IF nr_stud >= room_capacity THEN
:NEW.COURSE_ID := 'DUMMY';
:NEW.OBSERVATION := 'ROOM LIMITS OVERFILLED FOR ROOM '|| room;
END IF;
END;

Prof. Felicia Ionescu Cap. 2 - Baze de date active 10


Impunerea unor reguli specifice (4)
„ Comportarea:
„ De exemplu cursul BD este distribuit in sala B10 cu capacitate de 6 locuri
„ La inserarea in ENROLMENT a unor studenti la cursul de BD peste aceasta
limita, acestia vor fi pusi intr-o lista separata (DUMMY), cu specificarea
cauzei acestei actiuni
„ insert into enrolment (COURSE_ID, STUDENT_ID) values ('BD', 7);
„ Tabelul ENROLMENT arata astfel in SQL Developer:

Prof. Felicia Ionescu Cap. 2 - Baze de date active 11


Prof. Felicia Ionescu Cap. 2 - Baze de date active 12

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