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