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