sp_settriggerorder (Transact-SQL)

S’applique à :SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

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.

Conventions de la syntaxe 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 du schéma auquel il appartient, le cas échéant, dont l’ordre doit être défini ou modifié. [triggerschema.] triggername est 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 les déclencheurs DDL ou d’ouverture de session.

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

Important

Le premier et le dernier déclencheurs doivent être deux déclencheurs différents.

Valeur Description
Première Le déclencheur est activé en premier.
Dernière Le déclencheur est activé en dernier.
Aucun L'ordre d'activation du déclencheur n'est pas défini.

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

Un déclencheur peut être désigné comme premier ou dernier déclencheur pour un type d’instruction uniquement après que ce déclencheur a été défini comme déclencheur pour ce type d’instruction. Par exemple, le déclencheur TR1 peut être désigné en premier pour INSERT sur la table T1 si TR1 est défini en tant que déclencheur INSERT. Le moteur de base de données retourne une erreur si TR1, qui a été défini uniquement en tant que déclencheur INSERT, est défini en tant que premier ou dernier déclencheur pour une instruction UPDATE. Pour plus d'informations, consultez la section Notes.

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

  • SERVER s’applique à : SQL Server 2008 (10.0.x) et versions ultérieures.

Codet de retour

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

Remarques

Déclencheurs DML

Il ne peut y avoir qu’un seul déclencheur First et Last pour chaque instruction sur une seule table.

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

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. 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 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 TRIGGER sur le déclencheur de réplication, ou utilisez sp_settriggerorder pour remplacer le déclencheur de réplication par un déclencheur Last ou None , l’abonnement ne fonctionne pas correctement.

Déclencheurs DDL

Si un déclencheur DDL avec étendue de base de données et un déclencheur DDL avec étendue serveur existent sur le même événement, vous pouvez spécifier que les deux déclencheurs sont un premier déclencheur ou un dernier déclencheur. 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. Déclencheur au niveau du serveur marqué First.

  2. Autres déclencheurs de niveau serveur.

  3. Déclencheur au niveau du serveur marqué Last.

  4. Déclencheur au niveau de la base de données marqué First.

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

  6. Déclencheur au niveau de la base de données marqué Last.

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

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

Si le même déclencheur doit être désigné comme premier ou dernier ordre pour plusieurs types d’instruction, sp_settriggerorder doit être exécuté pour chaque type d’instruction. En outre, le déclencheur doit d’abord être défini pour un type d’instruction avant de pouvoir être désigné comme premier ou dernier déclencheur à déclencher pour ce type d’instruction.

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

R. 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 AdventureWorks2022;  
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 AdventureWorks2022.

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

Voir aussi

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)