Module 13 : Implémentation de déclencheurs
Vue d'ensemble Présentation des déclencheurs Définition de déclencheurs Exemples de déclencheurs Performances
Présentation des déclencheurs Caractéristiques d'un déclencheur Utilisation des déclencheurs Considérations relatives à l'utilisation des déclencheurs
Caractéristiques d'un déclencheur Association à une table Appel automatique Appel direct impossible Transaction
Utilisation des déclencheurs Modifications en cascade par le biais de tables connexes d'une base de données Application d'une intégrité des données plus complexe qu'une contrainte CHECK Définition de messages d'erreur personnalisés Mise à jour de données dénormalisées Comparaison des états précédents et suivants des données modifiées
Considérations relatives à l'utilisation des déclencheurs Les déclencheurs sont réactifs alors que les contraintes sont proactives Les contraintes sont contrôlées en premier Les tables peuvent disposer de plusieurs déclencheurs pour tout type d'opération Les propriétaires de tables doivent disposer d'autorisations Les déclencheurs ne peuvent pas être créés dans des vues ou des tables temporaires Les déclencheurs ne doivent pas renvoyer de jeux de résultats Les déclencheurs peuvent traiter des opérations multilignes
Définition de déclencheurs Création de déclencheurs Modification et suppression de déclencheurs Fonctionnement des déclencheurs
Création de déclencheurs Instruction CREATE TRIGGER Autorisations appropriées nécessaires Restrictions relatives aux instructions CREATE TRIGGER member_delete ON member FOR DELETE AS IF EXISTS (SELECT d.member_no FROM loan l INNER JOIN deleted d ON l.member_no = d.member_no ) BEGIN RAISERROR ( ' Member has Books Checked Out *** Cannot Delete ', 10, 1) ROLLBACK TRANSACTION END CREATE TRIGGER member_delete ON member FOR DELETE AS IF EXISTS (SELECT d.member_no FROM loan l INNER JOIN deleted d ON l.member_no = d.member_no ) BEGIN RAISERROR ( ' Member has Books Checked Out *** Cannot Delete ', 10, 1) ROLLBACK TRANSACTION END
Modification et suppression de déclencheurs Modification d'un déclencheur Changement de la définition sans suppression du déclencheur Activation ou désactivation d'un déclencheur Suppression d'un déclencheur ALTER TRIGGER loan_insert ON loan FOR INSERT AS UPDATE copy SET on_loan = ' y ' FROM copy INNER JOIN inserted ON copy.isbn = inserted.isbn AND copy.copy_no = inserted.copy_no ALTER TRIGGER loan_insert ON loan FOR INSERT AS UPDATE copy SET on_loan = ' y ' FROM copy INNER JOIN inserted ON copy.isbn = inserted.isbn AND copy.copy_no = inserted.copy_no
Fonctionnement des déclencheurs Fonctionnement d'un déclencheur INSERT Fonctionnement d'un déclencheur DELETE Fonctionnement d'un déclencheur UPDATE Fonctionnement des déclencheurs imbriqués Déclencheurs récursifs
Fonctionnement d'un déclencheur INSERT INSERT loan VALUES (603, 4, 11, 123, GETDATE(), (GETDATE() + 30)) INSERT loan VALUES (603, 4, 11, 123, GETDATE(), (GETDATE() + 30))loanloan isbn copy_no title_no mem_no outdate duedate /13/91 02/14/91 02/13/91 02/14/91 02/27/91 02/28/91 02/27/91 02/28/91 loanloan isbn copy_no title_no mem_no outdate duedate /13/91 02/14/91 02/13/91 02/14/91 02/27/91 02/28/91 02/27/91 02/28/ /13/9102/27/91loanloan isbn copy_no title_no mem_no outdate duedate /13/91 02/14/91 02/13/91 02/14/91 02/27/91 02/28/91 02/27/91 02/28/ /15/9103/17/91 insertedinserted /15/91 03/17/91 Journalisation de l'instruction Insert Instruction INSERT sur une table, avec un déclencheur INSERT défini loanloan isbn copy_no title_no mem_no outdate duedate /13/91 02/14/91 02/13/91 02/14/91 02/27/91 02/28/91 02/27/91 02/28/ /15/9103/17/91 Exécution des opérations du déclencheur /* Code du déclencheur */ USE library CREATE TRIGGER loan_insert ON loan FOR INSERT AS UPDATE c SET on_loan = 'Y' FROM copy c INNER JOIN inserted I ON c.isbn = i.sbn and c.copy_no = i.copy_no /* Code du déclencheur */ USE library CREATE TRIGGER loan_insert ON loan FOR INSERT AS UPDATE c SET on_loan = 'Y' FROM copy c INNER JOIN inserted I ON c.isbn = i.sbn and c.copy_no = i.copy_no UPDATE c SET on_loan = 'Y' FROM copy c INNER JOIN inserted I ON c.isbn = isbn and c.copy_no = i.copy_nocopycopy isbn copy_no title_no on_loan YYNNYYNN YYNNYYNN Y Application d'une instruction INSERT à une table dans laquelle un déclencheur INSERT est défini Journalisation d'une instruction INSERT Exécution des opérations du déclencheur
DELETE loan WHERE isbn = 4 AND copy_no = 1 DELETE loan WHERE isbn = 4 AND copy_no = 1 Fonctionnement d'un déclencheur DELETE Instruction DELETE sur une table, avec un déclencheur DELETE définiloanloan isbn copy_no title_no mem_no outdate duedate /13/91 02/14/91 02/13/91 02/14/91 02/27/91 02/28/91 02/27/91 02/28/ /13/9102/27/91 loanloan isbn copy_no title_no mem_no outdate duedate /13/91 02/14/91 02/13/91 02/14/91 02/27/91 02/28/91 02/27/91 02/28/ /13/9102/27/91loanloan isbn copy_no title_no mem_no outdate duedate /13/91 02/14/91 02/13/91 02/14/91 02/27/91 02/28/91 02/27/91 02/28/91 DeletedDeleted /13/91 02/27/91 Journalisation de l'instruction DELETE Exécution des opérations du déclencheur USE library CREATE TRIGGER loan_delete ON loan FOR DELETE AS UPDATE c SET on_loan = 'N' FROM copy c INNER JOIN deleted d ON c.isbn = d.isbn AND c.copy_no = d.copy.no USE library CREATE TRIGGER loan_delete ON loan FOR DELETE AS UPDATE c SET on_loan = 'N' FROM copy c INNER JOIN deleted d ON c.isbn = d.isbn AND c.copy_no = d.copy.no copycopy isbn copy_no title_no on_loan YYNNYYNN YYNNYYNN N UPDATE c SET on_loan = 'N' FROM copy c INNER JOIN deleted d ON c.isbn = d.isbn AND c.copy_no = d.copy.no Application d'une instruction DELETE à une table dans laquelle un déclencheur DELETE est défini Journalisation d'une instruction DELETE Exécution des opérations du déclencheur
Fonctionnement d'un déclencheur UPDATE Instruction UPDATE sur une table, avec un déclencheur UPDATE défini UPDATE member SET member_no = WHERE member_no = 1234 UPDATE member SET member_no = WHERE member_no = 1234 Instruction UPDATE journalisée en tant qu'instructions INSERT et DELETEmembermember member_no lastname firstname middleinitial photograph Anderson Barr Anderson Barr Anderson Andrew Bill Andrew Bill A R NULL B A R NULL B ~~~ 1234BarrAndrewR ~~~ insertedinserted Barr Andrew R R ~~~ deleteddeleted 1234 Barr Andrew R R ~~~ Exécution des opérations du déclencheur USE library GO CREATE TRIGGER member_update ON member FOR UPDATE AS IF UPDATE (member_no) BEGIN RAISERROR ('La transaction ne peut pas être traitée.\ ***** Impossible de modifier le numéro d''abonné.', 10, 1) ROLLBACK TRANSACTION USE library GO CREATE TRIGGER member_update ON member FOR UPDATE AS IF UPDATE (member_no) BEGIN RAISERROR ('La transaction ne peut pas être traitée.\ ***** Impossible de modifier le numéro d''abonné.', 10, 1) ROLLBACK TRANSACTION AS IF UPDATE (member_no) BEGIN RAISERROR ('La transaction ne peut pas être traitée.\ ***** Impossible de modifier le numéro d''abonné.', 10, 1) ROLLBACK TRANSACTION La transaction ne peut pas être traitée. ***** Impossible de modifier le numéro d'abonné. La transaction ne peut pas être traitée. ***** Impossible de modifier le numéro d'abonné. membermember member_no lastname firstname middleinitial photograph Anderson Barr Anderson Barr Anderson Andrew Bill Andrew Bill A R NULL B A R NULL B ~~~ 1234BarrAndrewR ~~~ Application d'une instruction UPDATE à une table dans laquelle un déclencheur UPDATE est défini Journalisation d'une instruction UPDATE dans le cadre des instructions INSERT et DELETE Exécution des opérations du déclencheur
Fonctionnement des déclencheurs imbriqués L'article doit être rendu le 22/05/98 loan_update Exécution du déclencheur Loan_update Exécution d'une instruction UPDATE dans la table Copy copy_update loanloan isbn copy_no title_no mem_no outdate duedate /13/91 02/14/91 02/13/91 02/14/91 02/27/91 02/28/91 02/27/91 02/28/ /13/9102/27/91 copycopy isbn copy_no title_no on_loan YYNNYYNN YYNNYYNN Y Exécution du déclencheur Copy_update Envoi d'un message
Déclencheurs récursifs Activation d'un déclencheur récursif Types de déclencheurs récursifs Raisons motivant l'utilisation de déclencheurs récursifs Permettent de gérer des relations complexes Nécessitent un contrôle final de la récursivité dans la définition du déclencheur
Exemples de déclencheurs Application de l'intégrité des données Application de règles de fonctionnement
Application de l'intégrité des données CREATE TRIGGER reservation_delete ON loan FOR INSERT AS IF (SELECT r.member_no FROM reservation r JOIN inserted i ON r.member_no = i.member_no AND r.isbn = i.isbn ) > 0 BEGIN DELETE r FROM reservation r INNER JOIN inserted i ON r.member_no = i.member_no AND r.isbn = i.isbn END loanloan isbn copy_no mem_no Ligne insérée reservationreservation isbn mem_no log_date 07/14/98 07/12/98 06/07/98 07/14/98 07/12/98 06/07/98 07/14/98 remarks ~~~ Ligne supprimée par le déclencheur
Application de règles de fonctionnement ' Transaction cannot be processed ' ' This member still has books on loan ' ' Transaction cannot be processed ' ' This member still has books on loan 'membermember member_no lastname firstname Anderson Barr Anderson Barr Anderson Andrew Bill Andrew Bill 2BarrAndrew Impossible de supprimer les abonnés qui ont encore des livres en leur possession IF (Select Count (*) FROM loan INNER JOIN deleted ON loan.member_no = deleted.member_no) > 0 ROLLBACK TRANSACTION IF (Select Count (*) FROM loan INNER JOIN deleted ON loan.member_no = deleted.member_no) > 0 ROLLBACK TRANSACTION Instruction DELETE exécutée dans la table Member Contrôle de la table Loan par le code du déclencheurloanloan isbn copy_no title_no mem_no Transaction annulée Transaction annuléemembermember member_no lastname firstname Anderson Barr Anderson Barr Anderson Andrew Bill Andrew Bill membermember member_no lastname firstname Anderson Barr Anderson Barr Anderson Andrew Bill Andrew Bill 2BarrAndrew
Performances Les déclencheurs s'exécutent rapidement, car les tables Inserted et Deleted figurent dans la mémoire cache Le temps d'exécution est déterminé par : le nombre de tables spécifiées le nombre de lignes concernées Les opérations contenues dans les déclencheurs font implicitement partie d'une transaction
Conseils pratiques Simplifiez au maximum les définitions Évitez d'utiliser les instructions ROLLBACK dans les déclencheurs Utilisez des déclencheurs uniquement en cas de nécessité Prévoyez un contrôle final de la récursivité dans les déclencheurs récursifs
Atelier 13.1: Création de déclencheurs
Contrôle des acquis Présentation des déclencheurs Définition de déclencheurs Exemples de déclencheurs Performances