Exécution des déclencheurs DML
Les déclencheurs AFTER ne sont jamais exécutés en cas de violation de contrainte et ne peuvent donc pas être utilisés pour tout traitement susceptible d'éviter les violations de contrainte.
Les déclencheurs INSTEAD OF sont exécutés à la place de l'action de déclenchement. Ils sont activés après la création des tables inserted et deleted reflétant les modifications apportées à la table de base, mais avant l'exécution de toute autre action. Ils sont exécutés avant toute contrainte, ce qui leur permet d'effectuer un prétraitement qui complète les actions des contraintes.
Si un déclencheur INSTEAD OF défini sur une table exécute une instruction portant sur cette table et susceptible de le redéclencher, il n'est pas appelé de façon récurrente. L'instruction est traitée comme si la table ne détenait aucun déclencheur INSTEAD OF et démarre la chaîne des opérations de contrainte et des exécutions du déclencheur AFTER. Par exemple, si un déclencheur DML est défini sur une table comme déclencheur d'insertion INSTEAD OF (INSERT) et qu'il exécute une instruction INSERT sur cette table, cette instruction INSERT ne l'appelle pas une seconde fois. L'instruction INSERT exécutée par le déclencheur démarre le processus d'exécution des actions de contrainte et d'activation de tout déclencheur d'insertion AFTER (INSERT) défini pour la table.
Si un déclencheur INSTEAD OF défini sur une vue exécute une instruction portant sur cette vue et susceptible de l'activer de nouveau, il n'est pas appelé de façon récurrente. L'instruction est résolue sous forme de modifications apportées aux tables de base sous-jacentes de la vue. Dans ce cas, la définition de la vue doit respecter toutes les restrictions applicables à une vue pouvant être mise à jour. Pour obtenir une définition des vues pouvant être mises à jour, consultez Modification de données par l'intermédiaire d'une vue. Par exemple, si un déclencheur DML est défini sur une vue comme déclencheur de mise à jour INSTEAD OF (UPDATE) et qu'il exécute une instruction UPDATE faisant référence à cette vue, cette instruction UPDATE ne l'appelle pas une seconde fois, mais elle est appliquée à la vue comme si celle-ci ne comportait pas de déclencheur INSTEAD OF. Les colonnes modifiées par l'instruction UPDATE doivent être résolues dans une seule table de base. Chaque modification d'une table de base sous-jacente démarre la chaîne d'application des contraintes et d'activation des déclencheurs AFTER définis sur la table.
En termes de performances, les déclencheurs DML consomment peu de ressources système. Le plus clair du temps passé à exécuter un déclencheur DML est consacré à des accès à d'autres tables, qui peuvent se trouver soit en mémoire, soit sur l'unité de base de données. Les tables deleted et inserted sont toujours en mémoire. L'emplacement des autres tables auxquelles fait référence le déclencheur détermine la durée requise pour l'opération.
Notes
L'utilisation de curseurs dans les déclencheurs DML n'est pas recommandée en raison de son impact sur les performances. Au lieu des curseurs, utilisez une logique basée sur un ensemble de lignes afin de concevoir un déclencheur DML portant sur plusieurs lignes.
Exécution de déclencheurs DML et vues partitionnées
Le mode de déclenchement des déclencheurs UPDATE et DELETE sur les tables sous-jacentes à une vue partitionnée a été modifié par rapport à SQL Server 2000. Dans SQL Server 2000, quand une instruction UPDATE or DELETE est exécutée sur une vue partitionnée, qu'elle soit locale ou distribuée, les déclencheurs UPDATE ou DELETE définis sur les tables de base de la vue se déclenchent. Sont également inclus les déclencheurs non affectés par l'opération de mise à jour ou de suppression. Dans SQL Server 2008 et SQL Server 2005, un déclencheur UPDATE ou DELETE ne se déclenche que si la table de base sur laquelle il est défini est affectée par l'opération de mise à jour ou de suppression. Ce comportement est le même pour les déclencheurs AFTER et INSTEAD OF.
Imaginons, par exemple, une vue partitionnée PV composée de champs des tables T1 et T2. En outre, des déclencheurs UPDATE sont définis sur les deux tables T1 et T2. Dans SQL Server 2000, une instruction UPDATE exécutée sur PV qui n'affecte que les lignes de T1 provoque le déclenchement des déclencheurs UPDATE sur les deux tables T1 et T2. Dans SQL Server 2008 et SQL Server 2005, seul le déclencheur UPDATE défini sur T1 se déclenche.
Le tableau suivant récapitule les différences de comportement.
Opération Insert, Update ou Delete sur une vue partitionnée locale
|
SQL Server 2000 |
Version actuelle |
---|---|---|
Déclencheur INSERT |
Ne se déclenche que sur les tables affectées. |
Ne se déclenche que sur les tables affectées. |
Déclencheur UPDATE |
Se déclenche pour toutes les tables sous-jacentes à la vue partitionnée sur lesquelles ce type de déclencheur est défini. |
Ne se déclenche que sur les tables affectées. |
Déclencheur DELETE |
Se déclenche pour toutes les tables sous-jacentes à la vue partitionnée sur lesquelles ce type de déclencheur est défini. |
Ne se déclenche que sur les tables affectées. |
Opération Insert, Update ou Delete sur une vue partitionnée distribuée
|
SQL Server 2000 |
Version actuelle |
---|---|---|
Déclencheur INSERT |
Ne se déclenche que sur les tables affectées de la vue partitionnée distribuée. Les déclencheurs définis sur les tables de l'instance locale et de l'instance distante peuvent se déclencher, si les tables sont affectées. |
Ne se déclenche que sur les tables affectées de la vue partitionnée distribuée. Les déclencheurs définis sur les tables de l'instance locale et de l'instance distante peuvent se déclencher, si les tables sont affectées. |
Déclencheur UPDATE |
Se déclenche pour toutes les tables sous-jacentes à la vue partitionnée sur lesquelles ce type de déclencheur est défini. |
Se déclenche pour toutes les tables de l'instance distante sur lesquelles ce type de déclencheur est défini. Ne se déclenche que sur les tables affectées de l'instance locale. |
Déclencheur DELETE |
Se déclenche pour toutes les tables sous-jacentes à la vue partitionnée sur lesquelles ce type de déclencheur est défini. |
Se déclenche pour toutes les tables de l'instance distante sur lesquelles ce type de déclencheur est défini. Ne se déclenche que sur les tables affectées de l'instance locale. |