site:enseignement:licence:2i009:tme_triggers
Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
site:enseignement:licence:2i009:tme_triggers [04/12/2018 14:06] – créée amann | site:enseignement:licence:2i009:tme_triggers [15/04/2019 19:24] (Version actuelle) – [Rappel PL/SQL] amann | ||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
====== TME 11 Triggers ====== | ====== TME 11 Triggers ====== | ||
- | Sous Oracle, le bloc d’instructions d’un trigger est un bloc PL/ | + | Sous Oracle, le bloc d’instructions d’un trigger est un bloc PL/SQL. Dans ce TME nous allons utiliser un sous-ensemble minimal de PL/SQL pour définir et modifier des variables |
- | Dans ce TME nous allons utiliser un sous-ensemble minimal de PL/SQL pour définir et modifier des variables | + | |
et exécuter des ordres SQL. | et exécuter des ordres SQL. | ||
- | ======= Rappel | + | ======= Rappel PL/SQL ======= |
**Bloc PL/SQL** | **Bloc PL/SQL** | ||
- | La syntaxe d'un bloc PL/SQL est rappelée | + | La syntaxe d'un bloc PL/SQL est rappelée ci-dessous. |
< | < | ||
Ligne 33: | Ligne 32: | ||
On utilise l’opérateur '': | On utilise l’opérateur '': | ||
- | Instructions PL/ | + | **Instructions PL/SQL** |
- | Une expression SQL est une instruction PL/SQL. Par exemple, on peut utiliser l' | + | Une expression SQL est une instruction PL/SQL. Par exemple, on peut utiliser l' |
<code sql> | <code sql> | ||
Ligne 56: | Ligne 55: | ||
Les commandes exit et exit when < | Les commandes exit et exit when < | ||
- | **Exceptions | + | **Exceptions** |
+ | Un trigger peut détecter une situation où il faut annuler une transaction (une transaction est une séquence de lectures et de mises-à-jour qui sont exécutées ou annulées ensemble). | ||
On ne peut pas annuler une transaction à l' | On ne peut pas annuler une transaction à l' | ||
Ligne 64: | Ligne 64: | ||
</ | </ | ||
+ | Le code d'une exception utilisateur doit être compris entre -20999 et -20000. | ||
** Limitations : ** | ** Limitations : ** | ||
Un trigger AFTER déchenché après un update (ou un insert) de la table T n'est pas autorisé à modifier la table T (ne pas écrire d' | Un trigger AFTER déchenché après un update (ou un insert) de la table T n'est pas autorisé à modifier la table T (ne pas écrire d' | ||
- | |||
Ligne 90: | Ligne 90: | ||
DROP TABLE INSCRIPTION; | DROP TABLE INSCRIPTION; | ||
CREATE TABLE INSCRIPTION ( | CREATE TABLE INSCRIPTION ( | ||
- | noEtudiant | + | noEtud |
noTD smallint, | noTD smallint, | ||
| | ||
- | PRIMARY KEY (noEtudiant, codeUE)) ; | + | PRIMARY KEY (noEtud, codeUE)) ; |
</ | </ | ||
Exécutez les instructions de création de tables ci-dessus dans le client Oracle (sqlplus). | Exécutez les instructions de création de tables ci-dessus dans le client Oracle (sqlplus). | ||
- | ({{: | + | ({{ : |
La clé primaire de relation TD est (noTD, codeUE) et celle de la relation INSCRIPTION est (noEtud, codeUE). | La clé primaire de relation TD est (noTD, codeUE) et celle de la relation INSCRIPTION est (noEtud, codeUE). | ||
Ligne 108: | Ligne 108: | ||
======= Questions ======= | ======= Questions ======= | ||
- | Pour chacune des questions suivantes, vérifier que le trigger est créé | + | Pour chacune des questions suivantes, vérifier que le trigger est créé sans erreurs et proposer des insertions/suppressions/mises à jour pour vérifier |
- | sans erreurs et qu'il fonctionne en proposant une insertion/suppression/mise à jour | + | |
- | dans la table concernée. | + | |
- | + | ||
- | - Créer un trigger qui assure que les valeurs des attributs NIVEAU et CODEUE, entrées dans la table TD, soient en majuscules, quelle que soit la casse utilisée lors des instructions d’insertion ou de mise à jour (utilisez la fonction UPPER). | + | |
- | - Créez un trigger qui empêche | + | |
- | - Créez un trigger qui empêche que le nombre de groupes par UE dépasse 4. | + | |
- | - Créez un trigger qui empêche le nombre d' | + | |
- | - Pour empêcher un étudiant de s’inscrire à des TD incompatibles (i.e. ayant lieu en même temps), | + | |
+ | ==== Question 1 ==== | ||
+ | Créer deux triggers qui assurent que les valeurs des attributs NIVEAU et CODEUE, entrées dans la table TD et INSCRIPTION, | ||
+ | ==== Question 2 ==== | ||
+ | | ||
+ | ==== Question 3 ==== | ||
+ | Créez un trigger qui empêche que le nombre de groupes de TD par UE dépasse 4. | ||
+ | ==== Question 4 ==== | ||
+ | Créez un trigger qui empêche qu’un étudiant suive deux TDs enseignés par le même enseignant. | ||
+ | ==== Question 5 ==== | ||
+ | Pour empêcher un étudiant de s’inscrire à des TD incompatibles (i.e. ayant lieu en même temps), | ||
Ecrire un trigger qui assure cette contrainte, de la façon suivante : | Ecrire un trigger qui assure cette contrainte, de la façon suivante : | ||
* en préambule à chaque inscription, | * en préambule à chaque inscription, | ||
Ligne 129: | Ligne 131: | ||
</ | </ | ||
* si l’étudiant a déjà pris une inscription correspondant au même jour et à la même heure, la contrainte de table précédente provoque le rejet du nouveau quadruplet | * si l’étudiant a déjà pris une inscription correspondant au même jour et à la même heure, la contrainte de table précédente provoque le rejet du nouveau quadruplet | ||
+ | |||
+ | ==== Question 6 (optionnel) ==== | ||
+ | Trouvez une solution pour la question précédente qui évite d’introduire la table supplémentaire LOCETUD. Conseil : il faut faire une jointure sur les tables TD et INSCRIPTION. | ||
site/enseignement/licence/2i009/tme_triggers.1543928819.txt.gz · Dernière modification : de amann