Spécification du premier et du dernier déclencheur

Vous pouvez définir l'un des déclencheurs AFTER associés à une table comme étant le premier ou le dernier déclencheur AFTER activé pour chaque action de déclenchement INSERT, DELETE et UPDATE. L'ordre d'exécution des déclencheurs AFTER activés entre les premier et dernier déclencheurs est indéfini.

Pour spécifier l'ordre d'exécution d'un déclencheur AFTER, utilisez la procédure stockée sp_settriggerorder, laquelle comporte les options suivantes.

Option

Description

First

Spécifie que le déclencheur DML est le premier déclencheur AFTER activé dans le cadre d'une action de déclenchement.

Last

Spécifie que le déclencheur DML est le dernier déclencheur AFTER activé dans le cadre d'une action de déclenchement.

None

Spécifie qu'il n'existe aucun ordre spécifique pour l'activation du déclencheur DML. Cette option est principalement destinée à réinitialiser un déclencheur qui était le premier ou le dernier déclencheur.

L'exemple suivant illustre l'utilisation de la procédure stockée sp_settriggerorder :

sp_settriggerorder @triggername = 'MyTrigger', @order = 'first', @stmttype = 'UPDATE'

Important

Le premier déclencheur et le dernier déclencheur doivent être deux déclencheurs DML distincts.

Plusieurs déclencheurs INSERT, UPDATE et DELETE peuvent être définis simultanément sur une table. Chaque type d'instruction peut posséder ses propres premier et dernier déclencheurs à condition qu'ils soient différents.

Si le premier ou dernier déclencheur défini pour une table ne couvre pas une action de déclenchement, telle que FOR UPDATE, FOR DELETE ou FOR INSERT, aucun premier ou dernier déclencheur n'est associé aux actions manquantes.

Un déclencheur INSTEAD OF ne peut pas être défini en tant que premier ou dernier déclencheur. Il est activé avant l'apport de mises à jour aux tables sous-jacentes. Si des mises à jour sont apportées par un déclencheur INSTEAD OF à des tables sous-jacentes, elles se produisent avant l'activation des déclencheurs AFTER définis sur la table. Par exemple, si un déclencheur INSTEAD OF INSERT sur une vue insère des données dans une table de base et si la table de base contient un déclencheur INSTEAD OF INSERT et trois déclencheurs AFTER INSERT, le déclencheur INSTEAD OF INSERT sur la table de base est activé au lieu de l'action d'insertion, et les déclencheurs AFTER sur la table de base sont activés après toute action d'insertion sur celle-ci. Pour plus d'informations, consultez Définition des circonstances d'activation d'un déclencheur DML.

Si une instruction ALTER TRIGGER modifie un premier ou un dernier déclencheur, l'attribut FIRST ou LAST est supprimé et l'ordre d'exécution prend la valeur NONE. L'ordre d'exécution doit être réinitialisé à l'aide de sp_settriggerorder.

La fonction OBJECTPROPERTY signale si un déclencheur est défini comme le premier ou le dernier à l'aide des propriétés ExecIsFirstTrigger et ExecIsLastTrigger.

La réplication génère automatiquement un premier déclencheur pour toute table qui est incluse dans un abonnement avec mise à jour immédiate ou en attente. Son déclencheur doit être le premier déclencheur. La réplication génère une erreur si vous tentez d'inclure une table comportant un premier déclencheur dans un abonnement avec mise à jour immédiate ou en attente. Si vous tentez de définir un déclencheur comme premier déclencheur après qu'une table a été incluse dans un abonnement, sp_settriggerorder retourne une erreur. Si vous utilisez ALTER sur le déclencheur de réplication ou si vous utilisez sp_settriggerorder pour que l'ordre corresponde au premier déclencheur ou pour qu'il n'y ait aucun ordre spécifique, l'abonnement ne fonctionnera pas correctement.