21/04/2015© Robert Godin. Tous droits réservés.1 6Gestion des contraintes d’intégrité en SQL n Contrainte d'intégrité statique – respectée pour chacun des états de la BD – mécanismes déclaratifs n PRIMARY KEY, UNIQUE, NOT NULL, DOMAIN, FOREIGN KEY, CHECK, ASSERTION – procédural n TRIGGER (SQL:1999) n Contrainte d'intégrité dynamique – contrainte sur changements d'états – référence aux états successifs – TRIGGER, REFERENCES ON DELETE…, ON UPDATE...
21/04/2015© Robert Godin. Tous droits réservés.2 6.1Contrainte de domaine n Types SQL – INTEGER – CHAR –... n NOT NULL n CHECK n CREATE DOMAIN
21/04/2015© Robert Godin. Tous droits réservés Contrainte NOT NULL n Par défaut : NULL
21/04/2015© Robert Godin. Tous droits réservés Contrainte CHECK sur une colonne n Le noClient est supérieur à 0 et inférieur à 100,000
21/04/2015© Robert Godin. Tous droits réservés Création d'un domaine (CREATE DOMAIN) Pas Oracle...
21/04/2015© Robert Godin. Tous droits réservés Valeur de défaut (DEFAULT)
21/04/2015© Robert Godin. Tous droits réservés.7 6.2Contrainte de clé primaire (PRIMARY KEY) n La clé primaire de la table Client est le noClient
21/04/2015© Robert Godin. Tous droits réservés.8 Clé primaire composée
21/04/2015© Robert Godin. Tous droits réservés.9 6.3Autres clés uniques (UNIQUE)
21/04/2015© Robert Godin. Tous droits réservés Contrainte d'intégrité référentielle (FOREIGN KEY REFERENCES) n Le noClient de la table Commande fait référence à la clé primaire noClient de la table Client n La table Client doit d ’abord être créée – privilège REFERENCES sur Client n PRIMARY KEY ou UNIQUE
21/04/2015© Robert Godin. Tous droits réservés Politique de gestion de la contrainte d'intégrité référentielle n Tentative de mise à jour de la clé primaire n Options – NO ACTION – CASCADE – SET NULL – SET DEFAULT
21/04/2015© Robert Godin. Tous droits réservés Politique NO ACTION n Rejet d ’une violation de la contrainte n Clause de défaut
21/04/2015© Robert Godin. Tous droits réservés.13 Cas du UPDATE
21/04/2015© Robert Godin. Tous droits réservés Politique CASCADE n Modification en cascade
21/04/2015© Robert Godin. Tous droits réservés.15 ON UPDATE CASCADE
21/04/2015© Robert Godin. Tous droits réservés Politiques SET NULL et SET DEFAULT
21/04/2015© Robert Godin. Tous droits réservés.17 SET DEFAULT
21/04/2015© Robert Godin. Tous droits réservés Clause MATCH PARTIAL/FULL
21/04/2015© Robert Godin. Tous droits réservés.19 Oracle n Défaut – ON DELETE NO ACTION – ON UPDATE NO ACTION n Supporte aussi – ON DELETE CASCADE – ON DELETE SET NULL (version 8i)
21/04/2015© Robert Godin. Tous droits réservés Autres contraintes n CHECK au delà d ’une colonne n ASSERTION générale
21/04/2015© Robert Godin. Tous droits réservés CHECK intra-ligne n Plusieurs colonnes de la même ligne n Les Articles dont le noArticle est supérieur à 90 ont un prix supérieur à $15.00
21/04/2015© Robert Godin. Tous droits réservés Check inter-ligne d'une même table n Concerne plusieurs lignes n Le prixUnitaire d'un Article ne peut dépasser le prix moyen de plus de $40.00 n Vérifié uniquement pour la ligne touchée – La contrainte peut être violée ! n Pas supporté par Oracle
21/04/2015© Robert Godin. Tous droits réservés CHECK inter-tables n Concerne plusieurs tables n Vérifié uniquement pour la ligne touchée – La contrainte peut être violée ! n Pas supporté par Oracle
21/04/2015© Robert Godin. Tous droits réservés Assertions générales n Le prixUnitaire moyen d'un Article ne peut dépasser $25.00 n Toujours valide par opposition au CHECK n Non supporté par Oracle
21/04/2015© Robert Godin. Tous droits réservés.25 Assertion inter-tables n La somme des quantitéLivrées pour une LigneCommande ne peut dépasser la quantité commandée
21/04/2015© Robert Godin. Tous droits réservés Implémentation de la vérification des contraintes d'intégrité n Problème non trivial n Vérifier uniquement les lignes modifiées n Simplification différentielle n Simplification sémantique – mécanismes d ’inférence
21/04/2015© Robert Godin. Tous droits réservés Cohérence des contraintes d'intégrité n Impossible de mettre à jour Article avec : n Problème difficile en général n Aucune ou peu de vérification dans les SGBD actuels
21/04/2015© Robert Godin. Tous droits réservés Nom de contrainte (clause CONSTRAINT) n DROP CONSTRAINT contNoClient n SET CONSTRAINT contNoClient … n Identification de la contrainte qui est violée à l ’exécution
21/04/2015© Robert Godin. Tous droits réservés Contraintes déférées (SET CONSTRAINTS DEFERRED) n Quand vérifier ? n Une Commande ne peut exister sans LigneCommande associée n Vérification immédiate par défaut – impossible d ’ajouter une Commande + ses LigneCommandes …
21/04/2015© Robert Godin. Tous droits réservés.30 Clause DEFERRABLE n Solution au problème : n Ou INITIALLY DEFERRED
21/04/2015© Robert Godin. Tous droits réservés Gâchettes (TRIGGER) n Procédure – déclenchée par événement pré-déterminé (INSERT, DELETE, UPDATE) – exécutée au niveau serveur de BD n BD active n Utilité – maintien de contraintes d ’intégrité n statique n dynamique n alternative aux mécanismes déclaratifs (CHECK, ASSERTION,...) – préférer mécanisme déclaratif – maintien d ’éléments dérivés n colonnes dérivées n copies dans BD répartie n... – historique des mises à jour n AUDIT – sécurité
21/04/2015© Robert Godin. Tous droits réservés.32 Lorsqu'une augmentation du prixUnitaire d'un Article est tentée, il faut limiter l'augmentation à 10% du prix en cours
21/04/2015© Robert Godin. Tous droits réservés Utilisation d'un TRIGGER pour le maintien d'une contrainte d'intégrité dynamique n Empêcher une augmentation du prixUnitaire d'un Article au delà de 10% du prix en cours n Oracle – RAISE_APPLICATION_ERROR
21/04/2015© Robert Godin. Tous droits réservés Utilisation d'un TRIGGER pour le maintien d'une contrainte d'intégrité statique n 0 < noClient < n N.B. CHECK est préférable !
21/04/2015© Robert Godin. Tous droits réservés Étude de cas n Lors d'une nouvelle livraison, la quantité à livrer ne peut dépasser la quantité en stock disponible
21/04/2015© Robert Godin. Tous droits réservés.36 CHECK SQL2 inadéquat
21/04/2015© Robert Godin. Tous droits réservés.37 Lors d'une modification d'une quantitéLivrée, la différence entre la nouvelle quantitéLivrée et l'ancienne quantitéeLivrée doit être inférieure ou égale à la quantitéEnStock
21/04/2015© Robert Godin. Tous droits réservés.38 Ne permettre que la modification de la quantitéLivrée dans la table DétailLiraison
21/04/2015© Robert Godin. Tous droits réservés.39 Ajuster la quantitéEnStock
21/04/2015© Robert Godin. Tous droits réservés.40 Extension procédurale pour corpsTrigger n Traitements complexes n Combiner plusieurs TRIGGER – vérifier quel est l ’événement déclencheur n Ordre d ’exécution des TRIGGER – BEFORE avant AFTER,... – entre TRIGGER de même type ? n forcer un ordre en combinant n Oracle – PL/SQL
21/04/2015© Robert Godin. Tous droits réservés TRIGGER de niveau STATEMENT n Exécution du corps une seule fois pour plusieurs lignes mises à jours dans le même énoncé
21/04/2015© Robert Godin. Tous droits réservés Ordre d'exécution des TRIGGER n Attention aux circularités !
21/04/2015© Robert Godin. Tous droits réservés Limites des TRIGGER n Ne peuvent être DEFERRED n Complexes à coder n Contraintes particulières aux dialectes
21/04/2015© Robert Godin. Tous droits réservés Particularités des TRIGGER Oracle n Pas de SELECT dans le WHEN n :NEW, :OLD n Omettre le mot-clé ROW dans REFERENCING n Corps en PL/SQL (voir chapitre 4). n Syntaxte :nomColonne n Pas de COMMIT/ROLLBACK dans un TRIGGER – procédure PL/SQL RAISE_APPLICATION_ERROR n IF INSERTING, DELETING, UPDATING. n Événements non standards – INSTEAD OF, STARTUP, LOGON,... n Problème avec table en mutation (modifée par l'événement déclencheur) n etc.
21/04/2015© Robert Godin. Tous droits réservés.47 Trigger INSTEAD OF pour VIEW non modifiable (non standard SQL:1999)
21/04/2015© Robert Godin. Tous droits réservés.48 suite