TD2
Transcription
TD2
TD d’ABD no 2 : déclencheur 22 janvier 2016 Objectifs : — reformuler des contraintes d’intégrité avec des déclencheurs — prédire le résultat lors de l’activation de déclencheurs en chaîne Exercice 1 Exprimer une contrainte de domaine à l’aide d’un déclencheur en SQL pour l’attribut A lors de l’insertion dans la table T. Exercice 2 Exprimer une contrainte de saisie non-nulle à l’aide d’un déclencheur en SQL pour l’attribut A lors de l’insertion dans la table T. Exercice 3 Exprimer une contrainte d’unicité à l’aide d’un déclencheur en SQL pour l’attribut A lors de l’insertion dans la table T. Exercice 4 On considère le déclencheur suivant sur la table R(a,b) : CREATE TRIGGER Rins AFTER INSERT ON R REFERENCING NEW ROW AS new FOR EACH ROW INSERT INTO R(a,b) (SELECT DISTINCT R.a, new.b FROM R WHERE R.b = new.a) EXCEPT (SELECT DISTINCT a,b FROM R) On suppose que la table R est initialement vide et qu’on y insère les trois tuples suivants dans cet ordre par l’intermédiaire de trois requêtes d’insertion distinctes : (8,16), (16,21) et (21,26). Après certaines de ces requêtes, le déclencheur Rins peut insérer d’autres tuples dans R, ce qui peut activer le déclencheur à nouveau récursivement. À l’issue de toutes ces insertions, quels tuples y a t-il dans la table R ? Exercice 5 On considère le déclencheur suivant sur la table R(a,b) : CREATE TRIGGER Rins AFTER INSERT ON R REFERENCING NEW ROW AS new FOR EACH ROW WHEN (new.a * new.b > 10) INSERT INTO R VALUES (new.a - 1, new.b + 1); On suppose que la table R est initialement vide. Après une insertion dans R, le déclencheur Rins peut insérer d’autres tuples dans R, ce qui peut activer le déclencheur à nouveau récursivement. Lister toutes les insertions possibles qui conduisent R à posséder exactement 3 tuples (les valeurs insérées sont comprises entre 0 et 10). Exercice 6 Soit trois tables vides T1, T2 et T3 contenant chacune un unique attribut A de type entier. 6 déclencheurs sont définis de la façon suivante (nous supposons que ces déclencheurs sont supportés) : 1 CREATE TRIGGER D1_1 BEFORE INSERT ON T1 FOR EACH ROW WHEN (SELECT COUNT(*) FROM T2) < 1 INSERT INTO T2 VALUES (6) CREATE TRIGGER D1_2 AFTER INSERT ON T1 FOR EACH ROW WHEN (SELECT COUNT(*) FROM T2) < 2 INSERT INTO T3 VALUES (25) CREATE TRIGGER D2_1 BEFORE INSERT ON T2 FOR EACH ROW WHEN (SELECT COUNT(*) FROM T3) < 1 INSERT INTO T3 VALUES (15) CREATE TRIGGER D2_2 AFTER INSERT ON T2 FOR EACH ROW WHEN (SELECT COUNT(*) FROM T1) < 10 INSERT INTO T1 VALUES (28) CREATE TRIGGER D3_1 BEFORE INSERT ON T3 FOR EACH ROW WHEN (SELECT COUNT(*) FROM T1) > 10 INSERT INTO T1 VALUES (21) CREATE TRIGGER D3_2 AFTER INSERT ON T3 FOR EACH ROW WHEN (SELECT COUNT(*) FROM T3) < 2 INSERT INTO T2 VALUES (32) On suppose que l’on exécute la requête INSERT INTO T1 VALUES (0). Décrire l’état des tables T1, T2 et T3 en donnant les valeurs dans leur ordre d’insertion (par exemple “T1 : 11, 12” si 11 est la première valeur insérée et 12 la seconde). 2