Vous êtes sur la page 1sur 8

Base de donnes Active SAOUDI Lalia

Base de donnes active

Les SGBDs doivent offrir des fonctionnalits supplmentaires afin de faciliter


limplmentation dapplications plus avances et plus complexes, les SGBD relationnels
restent efficaces, mais il est trs utiles didentifier des fonctionnalits communes certaines
de ces applications avances et de crer des modles qui reprsentent ces fonctionnalits, le
dveloppeur peut utiliser ces fonctionnalits directement si elles conviennent leurs
applications, sans devoir les r implmenter.
Bases de donnes passives:
Toutes les actions sur les donnes sont des invocations explicites de programme dapplication.
Le SGBD fait ce que le programme lui dit.
Exemples de problmes:
Contrle dinventaire : commander des produits lorsque le stock est sous un seuil prdfini.
Ce comportement peut tre implment avec une base de donnes passive par deux
mthodes :
1 ajouter une vrification dune condition dans chaque programme modifiant linventaire.
Une mauvaise solution de point de vue de Gnie Logiciel.
2 le programme dapplication doit vrifier linventaire priodiquement.
Frquence de vrification trs levmanque defficacit
Frquence de vrification faible - manque de fiabilit du pgm.
Do lide dajouter des fonctionnalits au SGBD pour vrifier la situation prcdente.
Bases de donnes Actives :
Est une extension des SGBDs traditionnels.
Le SGBDA est en gnral un SGBD qui contrle des situations dintrts, et dclenche
laction approprie lapparition dune situation.
Ensemble de primitives dun SGBD traditionnel+
Dfinition dun ensemble de situations + Dclencheurs dun ensemble de ractions.
Ce comportement est exprim dans des rgles de production (nomm aussi rgle
dvnement- condition-action) Qui sont dfinies et stockes dans la base de donnes.
Avantage de base de donnes active :
1- Simplifier les programmes dapplication : une partie de programme peut tre
programme avec les rgles actives de SGBD.
2- Augmenter lautomatisation : les actions sont dclenches automatiquement et sans
intervention de lutilisateur.
3- Augmenter la fiabilit de donnes : plus daction de vrification et de rparation,
mieux aider la dcision.
4- Augmenter la flexibilit : rduire le cot de dveloppement et de maintenance.

Modle de rgle ECA


Le Modle ECA Evnement, Condition, Action- est le modle gnralis appliqu pour
spcifier les rgles des bases de donnes actives, dans ce modle, une rgle est constitu de
trois composants :
On event
If condition
Then Action
1- Les vnements qui dclenchent la rgle.
2- La condition qui dtermine laction dfinie dans la rgle qui doit tre excute.
Si aucune condition nest spcifie, laction est excute ds que lvnement se
produit. Si une condition est spcifie, elle est dabord value et si le rsultat du test
est vrai, laction est excute.
Base de donnes Active SAOUDI Lalia

3- Laction excute est gnralement constitue dune squence dinstruction SQL,


mais il peut galement sagir dune transaction ou de lappel dun programme externe
qui sera lanc automatiquement.

WHEN event occurs


Toujours modifie une ligne dune table de la base de donnes.
IF condition holds
Elle est souvent une requte SQL attache la ligne de la table.
La condition est vraie si le rsultat de la requte nest pas nul
DO execute action
Des modifications SQL ou appel une procdure stocke
Exemple:
Evnement
Un client qui na pas rgl 3 factures avant la date limite
Condition
Si le crdit de client est infrieur 20 000 DA
Action
Annuler toutes ses commandes
- Les rgles peuvent exprimer des diverses aspects lis aux smantiques dapplication :
1- Des contraintes statiques : ex, les cardinalits, les contraintes dintgrits
rfrentielles, restriction de valeurs. ;
Seulement les tudiants rguliers peuvent senregistrer la bibliothque
Un encadreur ne peut pas encadrer plus de quatre groupes.
Le salaire dun employ ne peut pas dpasser le salaire de son manager.
2- Des contraintes sur la gestion workflow.
Si la commande est accepte, une facture proformat est rdige.
3- Des donnes historiques :
Exemple : les donnes mensuelles sur les bons de commandes sont transfres
lentrept des donnes

4- Implementation des relations gnriques:


Un lecteur est soit un enseignant ou un tudiant mais pas les deux en mme temps.
5- Donns drives : le nombre des tudiants enregistrs dans un cours doit tre parmi les
attributs du cours.
6- Contrle daccs : un employ ne peut consulter que les donnes de son dpartement.
Exercice : reformuler les exemples ci-dessous par les rgles ECA.
Base de donnes Active SAOUDI Lalia

Les triggers dOracle: (dclencheurs)


Trigger (dclencheur) : routine dclenche automatiquement par des vnements lis des
actions sur la base
Les triggers compltent les contraintes dintgrit en permettant des contrles et des
traitements plus complexes.
Syntaxe de trigger dOracle
trigger name
<Oracle-trigger> ::= CREATE TRIGGER <trigger-name>
trigger time point
{ BEFORE | AFTER }
triggering event(s)
<list of trigger-events>
ON <table-name>
[ [ REFERENCING <references> ]
trigger type (optional)
FOR EACH ROW
trigger restriction (only for for each row triggers !)
[ WHEN ( <condition> ) ] ]
trigger body
<actions>
<trigger-event> ::= INSERT | DELETE | UPDATE [ OF <column-names> ]
<references> ::= OLD AS <old-value-tuple-name> |
NEW AS <new-value-tuple-name>
<actions> ::=<PL/SQL block>
Nom de trigger : doit tre unique dans un mme schma.

Temps de trigger: il prcise le moment de l'excution du trigger


- les triggers AFTER row sont plus efficaces que les BEFORE row parce qu'ils ne ncessitent
pas une double lecture des donnes.

Liste des vnements de trigger: Elle comprend le type d'instruction SQL qui dclenche le
trigger :
DELETE, INSERT, UPDATE On peut en avoir une, deux ou les trois.
Pour UPDATE, on peut spcifier une liste de colonnes. Dans ce cas, le trigger ne se
dclenchera que si l'instruction UPDATE porte sur l'une au moins des colonnes prcise dans
la liste.
S'il n'y a pas de liste, le trigger est dclench pour toute instruction UPDATE portant sur la
table.
La liste des vnements du trigger prcise la table associe au trigger :
- une et une seule table
- /pas une vue.

Rfrences :
Les pseudo-variables :NEW et :OLD permettent de se rfrer aux anciennes et nouvelles
valeurs des lignes. :NEW a la valeur NULL aprs une commande delete et :OLD a la valeur
NULL aprs une commande insert. Elles ne sont videmment utilisables qu'avec l'option _for
each row_.
Une option _REFERENCING_ permet de donner un alias aux variables prfixes par :NEW
et :OLD :
CREATE TRIGGER totalAugmentation
Base de donnes Active SAOUDI Lalia

AFTER UPDATE OF sal ON emp


REFERENCING old as ancien, new as nouveau
FOR EACH ROW
update cumul
set augmentation = augmentation + nouveau.sal - ancien.sal
where matricule = ancien.matr

types de triggers
L'option for each row est facultative ; elle indique que le traitement du trigger doit tre
excute pour chaque ligne concerne par la requte dclenchante. Sinon, cette commande
n'est excute qu'une seule fois pour chaque requte dclenchante.
Il existe deux types de triggers diffrents : les triggers de table (STATEMENT) et les triggers
de ligne (ROW). Quelle est la diffrence ?
Les triggers de table sont excuts une seule fois lorsque des modifications surviennent sur
une table (mme si ces modifications concernent plusieurs lignes de la table). Ils sont utiles si
des oprations de groupe doivent tre ralises (comme le calcul dune moyenne, dune
somme totale, dun compteur, ). Pour des raisons de performance, il est prfrable
demployer ces triggers plutt que les triggers lignes.
Les triggers lignes sont excuts sparment pour chaque ligne modifie dans la table.
Ils sont trs utiles sil faut mesurer une volution pour certaines valeurs, effectuer des
oprations pour chaque ligne en question.

Lors de la cration de triggers lignes, il est possible davoir accs la valeur ancienne et la
valeur nouvelle grce aux mots cls OLD et NEW. Il nest pas possible davoir accs ces
valeurs dans les triggers de table.
Exemple de trigger table :
Ce trigger table enregistre dans une table log la trace de la modification de la
table Emp_tab. On mmorise ici le moment de la modification et lutilisateur qui
la provoqu. Il nest donc excut quune seule fois par modification de la table
Emp_tab.

CREATE TRIGGER log


AFTER INSERT OR UPDATE ON Emp_tab
BEGIN
INSERT INTO log(table, date, username, action)
VALUES ('Emp_tab', sysdate, sys_context('USERENV', 'CURRENT_USER'),
'INSERT/UPDATE on Emp_tab') ;
END ;
Ce trigger table enregistre dans une table log la trace de la modification de la
table Emp_tab. On mmorise ici le moment de la modification et lutilisateur qui
la provoqu. Il nest donc excut quune seule fois par modification de la table Emp_tab.

Exemple de trigger ligne :


Une table cumul sert enregistrer le cumul des augmentations dont ont bnfici les
employs d'une entreprise.
Exemple:
Soit un systme de gestion dun entrept avec deux relations:
-Inventory(Part,PartOnHand,ReorderPoint,ReorderQty)
- PendingOrders(Part,Qty,Date)
Base de donnes Active SAOUDI Lalia

Contrainte:il existe au maximum une commande par part dans PendingOrders (Part is the key
of
PendingOrders)
La regle de reapprovisionnement genere une nouvelle commande si la quantit PartOnhand
dun part donn est inferieur ReorderPoint

CREATE TRIGGER Reorder


AFTER UPDATE OF PartOnHand ON Inventory
FOR EACH ROW
WHEN (New.PartOnHand < New.ReorderPoint)
DECLARE NUMBER X;
BEGIN
SELECT COUNT(*) INTO X
FROM PendingOrders
WHERE Part = New.Part;
IF X = 0 THEN
INSERT INTO PendingOrders
VALUES (New.Part, New.ReorderQty, SYSDATE)
ENDIF;
END;
Oracle: Example of Row-Level After Trigger (2)
Part PartOnHand ReorderPoint ReorderQty
1 200 150 100
2 780 500 200
3 450 400 120
Transaction executed on October 10, 2000
UPDATE Inventory
SET PartOnHand = PartOnHand - 70
WHERE Part = 1
Result: insertion of (1,100,2000-10-10) into PendingOrders
Transaction executed the same day
UPDATE Inventory
SET PartOnHand = PartOnHand - 60
WHERE Part >= 1
Result: insertion of (3,120,2000-10-10) into PendingOrders
restriction de trigger (seulement pour chaque ligne de trigger!)
Il est possible d'ajouter une clause WHEN pour restreindre les cas o le trigger est excut.
WHEN est suivi de la condition ncessaire l'excution du trigger.
Cette condition peut rfrencer la nouvelle et l'ancienne valeur d'une colonne de la table (new
et old ne doivent pas tre prfixs par _ :_ comme l'intrieur du code du trigger.
Exemple :
create or replace trigger modif_salaire_trigger
before update of sal on emp
for each row
when (new.sal < old.sal)
begin
raise_application_error(-20001, 'Interdit de baisser le salaire ! (' || :old.nome || ')');
end;
Base de donnes Active SAOUDI Lalia

raise_application_error est une instruction Oracle qui permet de dclencher une erreur en lui
associant un message et un numro (compris entre -20000 et -20999).
La fin dun trigger (les exceptions)
Si une erreur se produit pendant l'excution d'un trigger, toutes les mises jour produites par
le trigger ainsi que par l'instruction qui l'a dclench sont dfaites.
On peut introduire des exceptions en provoquant des erreurs.
. Une exception est une erreur gnre dans une procdure PL/SQL.
. Elle peut tre prdfinie ou dfinie par l'utilisateur.
. Un bloc PL/SQL peut contenir un bloc EXCEPTION grant les diffrentes erreurs possibles
avec des clauses WHEN.
. Une clause WHEN OTHERS THEN ROLLBACK; gre le cas des erreurs non prvues.
Exceptions prdfinies : quelques exemples
NO_DATA_FOUND : cette exception est gnre quand un SELECT INTO ne retourne pas
de lignes
DUP_VAL_ON_INDEX : tentative d'insertion d'une ligne avec une valeur dj existante pour
une colonne index unique
ZERO_DIVIDE : division par zro
Exemple :
employe(numserv,....)
service(numserv,...)
/* vrifier que le service de l'employ existe bien */
CREATE TRIGGER verif_service
BEFORE INSERT OR UPDATE OF numserv ON employe
FOR EACH ROW WHEN (new.numserv is not null)
DECLARE
noserv integer;
BEGIN
noserv:=0;
SELECT numserv
INTO noserv
FROM SERVICE
WHERE numserv=:new.numserv;
IF (noserv=0)
THEN raise_application_error(-20501, 'N de service non correct');
END IF;
END;
Remarque :
Un trigger ligne ne peut accder une table mutante. est la table qui est en train d'tre modifie
Un trigger par lignes ne peut pas interroger ou modifier une table mutante.
Il faut donc comprendre quil nest pas permis de consulter ou modifier une table mutante.
Cette restriction prservera le trigger ligne de lire des donnes inconsistantes. Donc votre
trigger ligne ne devrait jamais accder la table sur laquelle il porte autrement que par OLD
et NEW.
Exemple :
CREATE OR REPLACE TRIGGER Emp_count
AFTER DELETE ON Emp_tab
FOR EACH ROW
DECLARE
N INTEGER;
BEGIN
Base de donnes Active SAOUDI Lalia

SELECT COUNT(*) INTO n FROM Emp_tab;


DBMS_OUTPUT.PUT_LINE('There are now ' || n || 'employees') ;
END ;
Dans cet exemple, la table mutante (celle qui est modifie par DELETE) est Emp_tab. Or, une
clause SELECT porte justement sur cette table. Le risque est dobtenir un rsultat
compltement incohrent. Cette consultation est donc interdite.

Il est autoris de modifier les valeurs des colonnes au travers de NEW (et donc crire dans le code
PL/SQL :new.val:=2 par exemple), uniquement dans des triggers lignes BEFORE.

Action :
Le corps de trigger est un block PL/SQL , toutes les commandes SQL et PL/SQL peuvent tre
utilises dans le ce block.
des structures if additionnelles permettent dexcuter certaines partie de block PL/SQL
dpend du type de lvnement dclencheur du trriger : il existe trois structures : if inserting ,
if updating < colonne> et if deleting. Exemple :
Begin Logging actions, on tables:
if inserting then create trigger LOG EMP
<PL/SQL block> after insert or update or delete on EMP
end if ; begin
if updating then if inserting then
<PL/SQL block> insert into EMP LOG values(user, INSERT, sysdate);
end if ; end if ;
if deleting then if updating then
<PL/SQL block> insert into EMP LOG values(user, UPDATE, sysdate);
end if ; end if ;
end; if deleting then insert into EMP LOG values(user, DELETE,
; sysdate);
end if ; end ;

Ordre de dclenchement.
Il peut y avoir plusieurs triggers sur le mme vnement.

Activation Dsactivation et Groupage des rgles :


Base de donnes Active SAOUDI Lalia

Une base de donnes active doit permettre aux utilisateurs dactiver des rgles, de les
dsactiver et de les supprimer en les dsignant par leurs noms.
Une rgle dsactive ne sera pas dclenche par lvnement dclencheur , cette
caractristique autorise dsactiver slectivement des rgles pendant les priodes o ne sont
pas ncessaires.
La commande activate ractive la rgle.
La commande drop fface la rgle du systme.
Il est galement possible de grouper les rgles en ensembles nomms, pour que lensemble
puisse tre activ, dsactiv ou supprim.
ALTER TRIGGER [schema.]nom_trig
{ENABLE | DISABLE}

Problmes de conception de BDDActive :


Lune des difficults la gnralisation des rgles actives , rside dans le fait quil sagit de
techniques relativement difficiles utiliser en termes de conception, par exemple il nest pas
vident de vrifier la cohrence dun ensemble de rgles , autrement dit de sassurer que deux
ou plusieurs rgles ne sont pas conflictuelles .
Il nest pas simple de garantir quun ensemble de rgles se terminera dans toutes les
circonstances.
Exemple :
R1 : create trigger T1
After insert on table1
For each row
Update table2
Set attribut1=..;
R2 : create trigger T2
After update attribut1 on table T2
For each Row
Insert into table1 values(..);