sp_settriggerorder (Transact-SQL)

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

Spécifie les AFTER déclencheurs déclenchés en premier ou dernier. Les AFTER déclencheurs déclenchés entre les premiers et les derniers déclencheurs sont exécutés dans un ordre non défini.

Conventions de la syntaxe Transact-SQL

Syntaxe

sp_settriggerorder
    [ @triggername = ] N'triggername'
    , [ @order = ] 'order'
    , [ @stmttype = ] 'stmttype'
    [ , [ @namespace = ] 'DATABASE' | 'SERVER' | NULL ]
[ ; ]

Arguments

[ @triggername = ] N’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é. @triggername est nvarchar(517), sans valeur par défaut, et est au format [ trigger_schema . ] trigger_name. Si le nom ne correspond pas à un déclencheur ou si le nom correspond à un INSTEAD OF déclencheur, la procédure retourne une erreur. Un schéma ne peut pas être spécifié pour les déclencheurs DDL ou d’ouverture de session.

[ @order = ] 'order'

Paramètre de la nouvelle commande du déclencheur. @order est varchar(10) et peut être l’une des valeurs suivantes.

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.

Important

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

[ @stmttype = ] 'stmttype'

Spécifie l’instruction Transact-SQL qui déclenche le déclencheur. @stmttype est varchar(50) et peut être INSERT, , UPDATE, DELETE, LOGONou n’importe quel événement d’instruction T-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 déclencheur First ou Last 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é First pour INSERT la table T1 s’il TR1 est défini comme déclencheur INSERT . Le Moteur de base de données retourne une erreur siTR1, qui a été défini uniquement comme déclencheurINSERT, est défini comme un First ou Last un déclencheur pour une UPDATE instruction. Pour plus d’informations, consultez la section Remarques.

@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 s’il NULL est spécifié, @triggername est un déclencheur DML.

Valeurs des codes de retour

0 (réussite) et 1 (échec).

Notes

Cette section traite des considérations relatives aux déclencheurs DML (Data Manipulation Language) et DDL (Data Definition Language).

Déclencheurs DML

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

Si un First déclencheur est déjà défini sur la table, la base de données ou le serveur, vous ne pouvez pas désigner de nouveau déclencheur comme First pour la même table, base de données ou serveur pour la même @stmttype. Cette restriction applique Last également des 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. La réplication nécessite que son déclencheur soit le premier déclencheur. 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éclencher un premier déclencheur une fois qu’une table est incluse dans un abonnement, sp_settriggerorder retourne une erreur. Si vous utilisez ALTER TRIGGER le déclencheur de réplication ou que vous utilisez sp_settriggerorder pour remplacer le déclencheur de réplication par un Last ou None un déclencheur, l’abonnement ne fonctionne pas correctement.

Déclencheurs DDL

Si un déclencheur DDL avec une é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 First déclencheur ou un Last 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 au niveau du 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 au niveau de la base de données
  6. Déclencheur au niveau de la base de données marqué Last

Considérations générales relatives au déclencheur

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

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 déclencheur First ou Last à déclencher pour ce type d’instruction.

Autorisations

La définition de l’ordre d’un déclencheur DDL avec l’étendue du serveur (créée ON ALL SERVER) ou un déclencheur d’ouverture de session nécessite CONTROL SERVER une autorisation.

La définition de l’ordre d’un déclencheur DDL avec l’étendue de base de données (créée ON DATABASE) nécessite ALTER ANY DATABASE DDL TRIGGER une autorisation.

La définition de l’ordre d’un déclencheur DML nécessite ALTER l’autorisation sur la table ou la vue sur laquelle le déclencheur est défini.

Exemples

R. Définir l’ordre de déclenchement d’un déclencheur DML

L’exemple suivant spécifie que le déclencheur est le premier déclencheur uSalesOrderHeader à déclencher une fois qu’une UPDATE opération se produit sur la Sales.SalesOrderHeader table.

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'Sales.uSalesOrderHeader',
    @order = 'First',
    @stmttype = 'UPDATE';

B. Définir l’ordre de déclenchement d’un déclencheur DDL

L’exemple suivant spécifie que le déclencheur ddlDatabaseTriggerLog est le premier déclencheur à déclencher après qu’un ALTER_TABLE événement se produise dans la AdventureWorks2022 base de données.

USE AdventureWorks2022;
GO

EXEC sp_settriggerorder @triggername = 'ddlDatabaseTriggerLog',
    @order = 'First',
    @stmttype = 'ALTER_TABLE',
    @namespace = 'DATABASE';