sp_settriggerorder (Transact-SQL)

Spécifie les déclencheurs AFTER activés en premier ou en dernier. L'ordre d'exécution des déclencheurs AFTER activés entre les premier et dernier déclencheurs est indéfini.

Icône Lien de rubrique Conventions de la syntaxe de Transact-SQL

Syntaxe

sp_settriggerorder [ @triggername = ] '[ triggerschema. ] triggername' 
    , [ @order = ] 'value' 
    , [ @stmttype = ] 'statement_type' 
    [ , [ @namespace = ] { 'DATABASE' | 'SERVER' | NULL } ]

Arguments

  • [ @triggername= ] '[ triggerschema**.] triggername'**
    Nom du déclencheur et, éventuellement, du schéma auquel il appartient, dont l'ordre doit être défini ou modifié. [triggerschema**.**]triggername est de type sysname. Si le nom ne correspond pas à un déclencheur ou si le nom correspond à un déclencheur INSTEAD OF, la procédure retourne une erreur. triggerschema ne peut pas être spécifié pour des déclencheurs DDL ou de connexion.

  • [ @order= ] 'value'
    Paramètre du nouvel ordre pour le déclencheur. value est de type varchar(10) et peut prendre l'une des valeurs suivantes.

    Important

    Les déclencheurs First et Last doivent être deux déclencheurs différents.

    Valeur

    Description

    First

    Le déclencheur est activé en premier.

    Last

    Le déclencheur est activé en dernier.

    None

    L'ordre d'activation du déclencheur n'est pas défini.

  • [ @stmttype= ] 'statement_type'
    Spécifie l'instruction SQL qui active le déclencheur. statement_type est de type varchar(50) et peut être INSERT, UPDATE, DELETE, LOGON ou n'importe quel événement d'instruction Transact-SQL répertorié dans Événements DDL. Les groupes d'événements ne peuvent pas être spécifiés.

    Un déclencheur peut être désigné comme déclencheur First ou Last pour un type d'instruction, uniquement après avoir été défini comme le déclencheur du type d'instruction spécifiée. Par exemple, le déclencheur TR1 peut être désigné comme First pour l'instruction INSERT sur la table T1, à condition que TR1 soit d'abord défini comme un déclencheur INSERT. Le moteur de base de données retourne une erreur si TR1, qui n'a été défini qu'en tant que déclencheur INSERT, est configuré en tant que déclencheur First ou Last pour une instruction UPDATE. Pour plus d'informations, consultez la rubrique Notes, ci-après.

  • @namespace= { 'DATABASE' | 'SERVER' | NULL }
    Lorsque triggername est un déclencheur DDL, indique si triggername a été créé avec une étendue de base de données ou de serveur. Si triggername est un déclencheur d'ouverture de session, SERVER doit être spécifié. Pour plus d'informations sur la portée des déclencheurs DDL, consultez Déclencheurs DDL. S'il n'est pas spécifié ou qu'il a pour valeur NULL, l'argument triggername est un déclencheur DML.

Valeurs des codes de retour

0 (succès) et 1 (échec)

Notes

Déclencheurs DML

Il ne peut y avoir qu'un déclencheur First et qu'un déclencheur Last par instruction sur une même table.

Si un déclencheur First est déjà défini sur la table, sur la base de données ou sur le serveur, vous ne pouvez pas désigner un nouveau déclencheur en tant que déclencheur First pour cette table, cette base de données ou ce serveur pour le même statement_type. Cette restriction s'applique également aux déclencheurs Last.

La réplication génère automatiquement un premier déclencheur pour toute table incluse dans un abonnement mis à jour immédiatement ou en attente. Elle nécessite un déclencheur qui soit le premier. Elle génère une erreur si vous essayez d'inclure une table détenant un premier déclencheur dans un abonnement mis à jour immédiatement ou en attente. Si vous essayez de définir un déclencheur en tant que premier déclencheur après avoir inclus une table dans un abonnement, sp_settriggerorder retourne une erreur. Si vous utilisez ALTER TRIGGER sur le déclencheur de réplication ou si, à l'aide de sp_settriggerorder, vous définissez son rang d'exécution sur Last ou None, l'abonnement ne fonctionnera pas correctement.

Déclencheurs DDL

Si un déclencheur DDL avec étendue de base de données et un déclencheur DDL avec étendue de serveur existent sur le même événement, vous pouvez spécifier que les deux déclencheurs sont un déclencheur First ou Last. Toutefois, les déclencheurs avec étendue de serveur se déclenchent toujours en premier. En général, l'ordre d'exécution des déclencheurs DDL qui existent sur le même événement est le suivant :

  1. Le déclencheur de niveau serveur marqué First.

  2. Autres déclencheurs de niveau serveur.

  3. Le déclencheur de niveau serveur marqué Last.

  4. Le déclencheur de niveau base de données marqué First.

  5. Autres déclencheurs de niveau base de données.

  6. Le déclencheur de niveau base de données marqué Last.

Considérations générales sur les déclencheurs

Si une instruction ALTER TRIGGER modifie un premier ou un dernier déclencheur, l'attribut First ou Last défini à l'origine sur le déclencheur est supprimé, et la valeur est remplacée par None. La valeur de l'ordre doit être réinitialisée à l'aide de sp_settriggerorder.

Si le même déclencheur doit être désigné comme le premier ou le dernier pour plusieurs types d'instructions, sp_settriggerorder doit être exécuté pour chaque type d'instruction. De même, le déclencheur doit d'abord être défini pour un type d'instruction avant de pouvoir être désigné comme déclencheur First ou Last, à déclencher pour ce type d'instruction spécifiée.

Autorisations

Pour définir l'ordre d'un déclencheur DDL avec étendue de serveur (à l'aide de la clause ON ALL SERVER) ou d'un déclencheur de connexion, requiert l'autorisation CONTROL SERVER sur le serveur.

Pour définir l'ordre d'un déclencheur DDL avec étendue de base de données (à l'aide de la clause ON DATABASE), requiert l'autorisation ALTER ANY DATABASE DDL TRIGGER.

Pour définir l'ordre d'un déclencheur DML, requiert l'autorisation ALTER sur la table ou vue sur laquelle le déclencheur est configuré.

Exemples

A.Définition de l'ordre d'activation d'un déclencheur DML

L'exemple suivant spécifie que le déclencheur uSalesOrderHeader est le premier déclencheur à activer après une opération UPDATE sur la table Sales.SalesOrderHeader.

USE AdventureWorks2012;
GO
sp_settriggerorder @triggername= 'Sales.uSalesOrderHeader', @order='First', @stmttype = 'UPDATE';

B.Définition de l'ordre d'activation d'un déclencheur DDL

L'exemple suivant spécifie que le déclencheur ddlDatabaseTriggerLog est le premier déclencheur à activer après un événement ALTER_TABLE dans la base de données AdventureWorks2012 .

USE AdventureWorks2012;
GO
sp_settriggerorder @triggername= 'ddlDatabaseTriggerLog', @order='First', @stmttype = 'ALTER_TABLE', @namespace = 'DATABASE';

Voir aussi

Référence

Procédures stockées système (Transact-SQL)

Procédures stockées du moteur de base de données (Transact-SQL)

ALTER TRIGGER (Transact-SQL)