sp_settriggerorder (Transact-SQL)
S’applique à : SQL Server Azure SQL Database Azure 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
, LOGON
ou 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 :
- Déclencheur au niveau du serveur marqué
First
- Autres déclencheurs au niveau du serveur
- Déclencheur au niveau du serveur marqué
Last
- Déclencheur au niveau de la base de données marqué
First
- Autres déclencheurs au niveau de la base de données
- 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_settriggerorder
de .
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';