CRÉER UN DÉCLENCHEUR (Transact-SQL) – SQL Server – Bien choisir son serveur d impression
<! –
serveur SQL
Base de données SQL Azure
Azure Synapse Analytics (SQL DW)
Entrepôt de données parallèle
serveur SQL
Base de données SQL Azure
Azure Synapse Analytics (SQL DW)
Entrepôt de données parallèle
Crée un déclencheur DML, DDL ou de connexion.Crée un déclencheur DML, DDL ou d'ouverture de session. Un déclencheur est un type spécial de procédure stockée qui s'exécute automatiquement lorsqu'un événement se produit sur le serveur de base de données.Un déclencheur est un type spécial de procédure stockée qui s'exécute automatiquement lorsqu'un événement se produit sur le serveur de base de données. Les déclencheurs DML s'exécutent lorsqu'un utilisateur tente de modifier des données via un événement DML (Data Manipulation Language).Les déclencheurs DML s'exécutent lorsqu'un utilisateur tente de modifier des données via un événement DML (Data Manipulation Language). Les événements DML sont des instructions INSERT, UPDATE ou DELETE exécutées sur une table ou une vue.Les événements DML sont des instructions INSERT, UPDATE ou DELETE sur une table ou une vue. Ces déclencheurs sont activés lorsqu'un événement valide est déclenché, que les lignes de table soient affectées ou non.Ces déclencheurs se déclenchent lorsqu'un événement valide se déclenche, que les lignes de la table soient affectées ou non. Pour plus d'informations, consultez Déclencheurs DML.Pour plus d'informations, consultez Déclencheurs DML.
Les déclencheurs DDL s'exécutent en réponse à différents événements DDL (Data Definition Language).Les déclencheurs DDL s'exécutent en réponse à divers événements DDL (Data Definition Language). Ces événements correspondent essentiellement aux instructions Transact-SQLTransact-SQL CREATE, ALTER et DROP et à certaines procédures stockées système qui effectuent des opérations de type DDL.Ces événements correspondent principalement à Transact-SQLTransact-SQL Instructions CREATE, ALTER et DROP et certaines procédures stockées système qui effectuent des opérations de type DDL.
Les déclencheurs LOGON sont activés en réponse à l'événement LOGON qui est déclenché lorsqu'une session utilisateur est établie.Les déclencheurs de connexion se déclenchent en réponse à l'événement LOGON qui se déclenche lors de l'établissement d'une session utilisateur. Vous pouvez créer des déclencheurs directement à partir des instructions Transact-SQLTransact-SQL ou méthodes d'assemblage créées dans le CLR (Common Language Runtime) MicrosoftMicrosoft .NET Framework.NET Framework et accusé dans une instance de serveur SQLserveur SQL.Vous pouvez créer des déclencheurs directement à partir de Transact-SQLTransact-SQL ou à partir de méthodes d'assemblys créées dans le MicrosoftMicrosoft .NET Framework.NET Framework Common Language Runtime (CLR) et téléchargé sur une instance de serveur SQLserveur SQL. serveur SQLserveur SQL vous permet de créer plusieurs déclencheurs pour une instruction spécifique.vous permet de créer plusieurs déclencheurs pour toute instruction spécifique.
Important
Le code malveillant dans les déclencheurs peut s'exécuter avec des privilèges promus.Le code malveillant à l'intérieur des déclencheurs peut s'exécuter avec des privilèges élevés. Pour plus d'informations sur la façon de réduire cette menace, voir Gérer la sécurité des déclencheurs.Pour plus d'informations sur la façon d'atténuer cette menace, voir Gérer la sécurité des déclencheurs.
Remarques
L'intégration du .NET Framework CLR avec SQL Server est décrite dans cet article.L'intégration de .NET Framework CLR dans SQL Server est abordée dans cet article. L'intégration CLR ne s'applique pas à Azure SQL Database.L'intégration CLR ne s'applique pas à Azure SQL Database.
Conventions de syntaxe Transact-SQL
Conventions de syntaxe Transact-SQL
SyntaxeSyntaxe
- Syntaxe SQL Server
- Déclenchement sur une instruction INSERT, UPDATE ou DELETE vers une table ou une vue (DML Trigger)
CRÉER [ OR ALTER ] DÉCLENCHEUR [ schema_name . ]trigger_name
ON table [AVEC[AVEC
[WITH [ ,...n ] ] APRÈS
[ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ]
[ WITH APPEND ]
[ NOT FOR REPLICATION ]
AS sql_statement [ ; ] [ ,...n ]
:: =
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
:: =
assembly_name.class_name.method_name
- Syntaxe SQL Server
- Déclencher une instruction INSERT, UPDATE ou DELETE sur un
- table (DML Trigger sur les tables à mémoire optimisée)
CRÉER [ OR ALTER ] DÉCLENCHEUR [ schema_name . ]trigger_name
Sur la table}[AVEC[AVEC
[WITH [ ,...n ] ] APRÈS
[ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ]
AS sql_statement [ ; ] [ ,...n ]
:: =
[ NATIVE_COMPILATION ]
[ SCHEMABINDING ]
[ EXECUTE AS Clause ]
- Déclencher un CREATE, ALTER, DROP, GRANT, DENY,
- Instruction REVOKE ou UPDATE (DDL Trigger)
CRÉER [ OR ALTER ] TRIGGER nom_déclencheur
SUR BASE DE DONNÉES[AVEC[AVEC
[WITH [ ,...n ] ]POUR event_type [ ,...n ]
AS NOM EXTERNE < method specifier > [ ; ]
:: =
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
- Déclenchement sur un événement LOGON (Logon Trigger)
CRÉER [ OR ALTER ] TRIGGER nom_déclencheur
SUR TOUS LES SERVEURS[AVEC[AVEC
[WITH [ ,...n ] ]POUR CONNEXION
AS sql_statement [ ; ] [ ,...n ]
:: =
[ ENCRYPTION ]
[ EXECUTE AS Clause ]
SyntaxeSyntaxe
- Syntaxe de la base de données Azure SQL
- Déclenchement sur une instruction INSERT, UPDATE ou DELETE vers une table ou une vue (DML Trigger)
CRÉER [ OR ALTER ] DÉCLENCHEUR [ schema_name . ]trigger_name
ON vue[AVEC[AVEC
[WITH [ ,...n ] ] AU LIEU DE
[ INSERT ] [ , ] [ UPDATE ] [ , ] [ DELETE ]
AS sql_statement [ ; ] [ ,...n ] [ ; ] >
:: =
[ EXECUTE AS Clause ]
- Syntaxe de la base de données Azure SQL
- Déclencher un CREATE, ALTER, DROP, GRANT, DENY,
- Instruction REVOKE ou UPDATE STATISTICS (DDL Trigger)
CRÉER [ OR ALTER ] TRIGGER nom_déclencheur
SUR DATABASE[AVEC[AVEC
[WITH [ ,...n ] ] APRÈS event_group [ ,...n ]
AS sql_statement [ ; ] [ ,...n ] [ ; ]
:: =
[ EXECUTE AS Clause ]
ArgumentsArguments
OU ALTEROU ALTER
S'applique à : Bleu azur Base de données SQLBase de données SQL, serveur SQLserveur SQL (de SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).S'applique à: Bleu azur Base de données SQLBase de données SQL, serveur SQLserveur SQL (commençant par SQL Server 2016 (13.x)SQL Server 2016 (13.x) SP1).
Modifie conditionnellement le déclencheur uniquement s'il existe déjà.Modifie conditionnellement le déclencheur uniquement s'il existe déjà.
nom_schémanom_schéma
Nom du schéma auquel appartient le déclencheur DML.Nom du schéma auquel appartient un déclencheur DML. La portée des déclencheurs DML est limitée au schéma de la table ou de la vue sur laquelle ils sont créés.Les déclencheurs DML sont limités au schéma de la table ou de la vue sur laquelle ils sont créés. Vous ne pouvez pas spécifier nom_schéma pour les déclencheurs DDL ou de connexion.nom_schéma ne peut pas être spécifié pour les déclencheurs DDL ou de connexion.
trigger_nametrigger_name
Nom du déclencheur.Le nom du déclencheur. UNE trigger_name doit respecter les règles applicables aux identifiants, sauf que trigger_name ne peut pas commencer par # ou ##.À trigger_name doit suivre les règles pour les identifiants, sauf que trigger_name ne peut pas commencer par # ou ##.
table | vuetable | vue
Table ou vue sur laquelle le déclencheur DML est exécuté.Table ou vue sur laquelle le déclencheur DML s'exécute. Cette table ou vue est parfois appelée table de déclenchement ou vue de déclenchement.Cette table ou vue est parfois appelée table de déclenchement ou vue de déclenchement. La spécification du nom complet de la table ou de la vue est facultative.La spécification du nom complet de la table ou de la vue est facultative. Vous ne pouvez référencer une vue que via un déclencheur INSTEAD OF.Vous ne pouvez référencer une vue que par un déclencheur INSTEAD OF. Vous ne pouvez pas définir de déclencheurs DML sur des tables temporaires locales ou globales.Vous ne pouvez pas définir de déclencheurs DML sur des tables temporaires locales ou globales.
BASE DE DONNÉESBASE DE DONNÉES
Applique la portée d'un déclencheur DDL à la base de données active.Applique la portée d'un déclencheur DDL à la base de données actuelle. Si spécifié, le déclencheur est activé à chaque foistype d'événement ou event_group se produit dans la base de données active.S'il est spécifié, le déclencheur se déclenche à chaque fois type d'événement or event_group se produit dans la base de données actuelle.
TOUS LES SERVEURSTOUS LES SERVEURS
S'applique à : SQL Server 2008SQL Server 2008 et ensuite.S'applique à: SQL Server 2008SQL Server 2008 et ensuite.
Applique l'étendue d'un déclencheur DDL ou d'une connexion au serveur actif.Applique la portée d'un déclencheur DDL ou d'ouverture de session au serveur actuel. Si spécifié, le déclencheur est activé à chaque foistype d'événement ou event_group se produit n'importe où sur le serveur actif.S'il est spécifié, le déclencheur se déclenche à chaque fois type d'événement or event_group se produit n'importe où sur le serveur actuel.
AVEC CHIFFREMENTAVEC CHIFFREMENT
S'applique à : SQL Server 2008SQL Server 2008 et ensuite.S'applique à: SQL Server 2008SQL Server 2008 et ensuite.
Masque le texte de l'instruction CREATE TRIGGER.Obscurcit le texte de l'instruction CREATE TRIGGER. L'utilisation de l'argument WITH ENCRYPTION empêche la publication du déclencheur pour la réplication serveur SQLserveur SQL.L'utilisation de WITH ENCRYPTION empêche la publication du déclencheur dans le cadre de serveur SQLserveur SQL réplication. Il n'est pas possible de spécifier WITH ENCRYPTION pour les déclencheurs CLR.WITH ENCRYPTION ne peut pas être spécifié pour les déclencheurs CLR.
EXECUTE ASEXECUTE AS
Spécifie le contexte de sécurité dans lequel le déclencheur est exécuté.Spécifie le contexte de sécurité dans lequel le déclencheur est exécuté. Cet argument contrôle le compte d'utilisateur que l'instance serveur SQLserveur SQL utilise pour valider les autorisations sur n'importe quel objet de la base de données référencée par le déclencheur.Vous permet de contrôler quel compte utilisateur l'instance de serveur SQLserveur SQL utilise pour valider les autorisations sur tous les objets de base de données référencés par le déclencheur.
Cette option est obligatoire pour les déclencheurs sur les tables optimisées en mémoire.Cette option est requise pour les déclencheurs sur les tables optimisées en mémoire.
Pour plus d'informations, consultez EXECUTE AS Clause (Transact-SQL).Pour plus d'informations, consultez Clause EXECUTE AS (Transact-SQL).
NATIVE_COMPILATIONNATIVE_COMPILATION
Indique que le déclencheur est compilé en mode natif.Indique que le déclencheur est compilé nativement.
Cette option est obligatoire pour les déclencheurs sur les tables optimisées en mémoire.Cette option est requise pour les déclencheurs sur les tables optimisées en mémoire.
SCHEMABINDINGSCHEMABINDING
Garantit que les tables référencées par un déclencheur ne peuvent pas être supprimées ou modifiées.Garantit que les tables référencées par un déclencheur ne peuvent pas être supprimées ou modifiées.
Cette option est requise pour les déclencheurs sur les tables optimisées en mémoire et n'est pas prise en charge pour les déclencheurs sur les tables traditionnelles.Cette option est requise pour les déclencheurs sur les tables à mémoire optimisée et n'est pas prise en charge pour les déclencheurs sur les tables traditionnelles.
POUR | APRÈSPOUR | APRÈS
FOR ou AFTER spécifie que le déclencheur DML n'est activé que lorsque toutes les opérations spécifiées dans l'instruction SQL ont été lancées correctement.FOR ou AFTER spécifie que le déclencheur DML ne se déclenche que lorsque toutes les opérations spécifiées dans l'instruction SQL de déclenchement ont été lancées avec succès. Toutes les actions référentielles en cascade et les vérifications de contraintes doivent également être effectuées avec succès pour que ce déclencheur soit activé.Toutes les actions en cascade référentielles et les vérifications de contraintes doivent également réussir avant que ce déclencheur ne se déclenche.
Vous ne pouvez pas définir de déclencheurs APRÈS sur les vues.Vous ne pouvez pas définir de déclencheurs APRÈS sur les vues.
AU LIEU DEAU LIEU DE
Spécifie que le déclencheur DML est lancé au lieu de l'instruction de déclenchement SQL, remplaçant les actions des instructions de déclenchement.Spécifie que le déclencheur DML se lance au lieu de l'instruction SQL de déclenchement, donc, remplaçant les actions des instructions de déclenchement. Vous ne pouvez pas spécifier INSTEAD OF pour DDL ou les déclencheurs de connexion.Vous ne pouvez pas spécifier INSTEAD OF pour DDL ou les déclencheurs de connexion.
Tout au plus, vous pouvez définir un déclencheur INSTEAD OF par une instruction INSERT, UPDATE ou DELETE sur une table ou une vue.Tout au plus, vous pouvez définir un déclencheur INSTEAD OF par instruction INSERT, UPDATE ou DELETE sur une table ou une vue. Vous pouvez également définir des vues sur les vues où chaque vue a son propre déclencheur INSTEAD OF.Vous pouvez également définir des vues sur les vues où chaque vue a son propre déclencheur INSTEAD OF.
Vous ne pouvez pas définir de déclencheurs INSTEAD OF sur des vues pouvant être mises à jour qui utilisent l'option WITH CHECK OPTION.Vous ne pouvez pas définir de déclencheurs INSTEAD OF sur des vues pouvant être mises à jour qui utilisent WITH CHECK OPTION. serveur SQLserveur SQL signale une erreur lorsqu'un déclencheur INSTEAD OF est ajouté à une telle vue avec l'option WITH CHECK OPTION spécifiée.Cela entraîne une erreur lorsqu'un déclencheur INSTEAD OF est ajouté à une vue pouvant être mise à jour AVEC UNE OPTION DE CONTRÔLE spécifiée. Vous supprimez cette option à l'aide de l'instruction ALTER VIEW avant de définir le déclencheur INSTEAD OF.Vous supprimez cette option en utilisant ALTER VIEW avant de définir le déclencheur INSTEAD OF.
[ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ]
Spécifie les instructions de modification des données qui activent le déclencheur DML lorsqu'une tentative est faite pour l'appliquer à cette table ou vue.Spécifie les instructions de modification des données qui activent le déclencheur DML lorsqu'il est essayé par rapport à cette table ou vue. Spécifiez au moins une option.Spécifiez au moins une option. Utilisez une combinaison de ces options dans n'importe quel ordre lors de la définition du déclencheur.Utilisez n'importe quelle combinaison de ces options dans n'importe quel ordre dans la définition du déclencheur.
Dans le cas des déclencheurs INSTEAD OF, vous ne pouvez pas utiliser l'option DELETE sur les tables dont la relation référentielle spécifie une action en cascade ON DELETE.Pour les déclencheurs INSTEAD OF, vous ne pouvez pas utiliser l'option DELETE sur les tables qui ont une relation référentielle, en spécifiant une action en cascade ON DELETE. De même, l'option UPDATE n'est pas autorisée sur les tables dont la relation référentielle spécifie une action ON UPDATE en cascade.De même, l'option UPDATE n'est pas autorisée sur les tables qui ont une relation référentielle, spécifiant une action en cascade ON UPDATE.
AVEC APPENDAVEC APPEND
S'applique à: SQL Server 2008SQL Server 2008 jusqu'à SQL Server 2008 R2SQL Server 2008 R2.S'applique à: SQL Server 2008SQL Server 2008 par SQL Server 2008 R2SQL Server 2008 R2.
Spécifie d'ajouter un déclencheur supplémentaire d'un type existant.Spécifie qu'un déclencheur supplémentaire d'un type existant doit être ajouté. La clause WITH APPEND ne peut pas être utilisée avec les déclencheurs INSTEAD OF ou si un déclencheur AFTER est explicitement indiqué.WITH APPEND ne peut pas être utilisé avec les déclencheurs INSTEAD OF ou si un déclencheur AFTER est explicitement indiqué. Pour une compatibilité ascendante, utilisez uniquement WITH APPEND lorsque FOR est spécifié, sans INSTEAD OF ou AFTER.Pour une compatibilité descendante, utilisez uniquement WITH APPEND lorsque FOR est spécifié, sans INSTEAD OF ou AFTER. Vous ne pouvez pas spécifier WITH APPEND si vous utilisez EXTERNAL NAME (c'est-à-dire si le déclencheur est un déclencheur CLR).Vous ne pouvez pas spécifier WITH APPEND si vous utilisez EXTERNAL NAME (c'est-à-dire si le déclencheur est un déclencheur CLR).
type d'événementtype d'événement
Nom d'un événement linguistique Transact-SQLTransact-SQL ce qui, après le lancement, provoque l'activation d'un déclencheur DDL.Le nom d'un Transact-SQLTransact-SQL événement de langage qui, après le lancement, provoque le déclenchement d'un déclencheur DDL. Les événements valides pour les déclencheurs DDL sont répertoriés dans Événements DDL.Les événements valides pour les déclencheurs DDL sont répertoriés dans Événements DDL.
event_groupevent_group
Nom d'un regroupement prédéfini d'événements linguistiques Transact-SQLTransact-SQL.Le nom d'un groupement prédéfini de Transact-SQLTransact-SQL événements linguistiques. Le déclencheur DDL est activé après l'exécution de tout événement de langue Transact-SQLTransact-SQL appartenir à event_group.Le déclencheur DDL se déclenche après le lancement de Transact-SQLTransact-SQL événement linguistique qui appartient à event_group. Les groupes d'événements valides pour les déclencheurs DDL sont répertoriés dans Groupes d'événements DDL.Les groupes d'événements valides pour les déclencheurs DDL sont répertoriés dans Groupes d'événements DDL.
Une fois CREATE TRIGGER terminé, event_group agit également comme une macro en ajoutant les types d'événements qu'il couvre à la vue de catalogue sys.trigger_events.Une fois l'exécution de CREATE TRIGGER terminée, event_group agit également comme une macro en ajoutant les types d'événements qu'il couvre à la vue de catalogue sys.trigger_events.
PAS POUR LA RÉPLICATIONPAS POUR LA RÉPLICATION
S'applique à : SQL Server 2008SQL Server 2008 et ensuite.S'applique à: SQL Server 2008SQL Server 2008 et ensuite.
Indique que le déclencheur ne doit pas être exécuté lorsqu'un agent de réplication modifie la table impliquée dans le déclencheur.Indique que le déclencheur ne doit pas être exécuté lorsqu'un agent de réplication modifie la table impliquée dans le déclencheur.
sql_statementsql_statement
Déclencher des conditions et des actions.Les conditions et actions de déclenchement. Les conditions de déclenchement spécifient des critères supplémentaires qui déterminent si les instructions DML, DDL ou de connexion tentées entraîneront l'exécution des actions de déclenchement.Les conditions de déclenchement spécifient des critères supplémentaires qui déterminent si les événements DML, DDL ou de connexion essayés entraînent l'exécution des actions de déclenchement.
Les actions de déclenchement spécifiées dans les instructions Transact-SQLTransact-SQL prendre effet lorsque l'opération est tentée.Les actions de déclenchement spécifiées dans le Transact-SQLTransact-SQL Les instructions prennent effet lorsque l'opération est tentée.
Les déclencheurs peuvent inclure n'importe quel type et nombre d'instructions Transact-SQLTransact-SQL. Il existe cependant des exceptions.Les déclencheurs peuvent inclure n'importe quel nombre et type de Transact-SQLTransact-SQL , à des exceptions près. Pour plus d'informations, consultez la section Notes.Pour plus d'informations, voir Remarques. Un déclencheur est utilisé pour vérifier ou modifier les données suite à une instruction de modification ou de définition. Il ne doit pas renvoyer de données à l'utilisateur.Un déclencheur est conçu pour vérifier ou changer des données en fonction d'une modification de données ou d'une instruction de définition; il ne doit pas renvoyer de données à l'utilisateur. Les instructions Transact-SQLTransact-SQL dans un déclencheur ont souvent un langage de contrôle de flux.thé Transact-SQLTransact-SQL les instructions d'un déclencheur incluent fréquemment un langage de contrôle de flux.
Les déclencheurs DML utilisent des tables logiques (conceptuelles) qui ont été supprimées ou insérées.Les déclencheurs DML utilisent les tables logiques (conceptuelles) supprimées et insérées. Leur structure est similaire à celle de la table sur laquelle le déclencheur est défini, c'est-à-dire la table sur laquelle l'action utilisateur est tentée.Ils sont structurellement similaires à la table sur laquelle le déclencheur est défini, c'est-à-dire la table sur laquelle l'action de l'utilisateur est tentée. Les tableaux supprimés et insérés contiennent les anciennes ou les nouvelles valeurs des lignes que l'action utilisateur peut modifier.Les tables supprimées et insérées contiennent les anciennes valeurs ou les nouvelles valeurs des lignes qui peuvent être modifiées par l'action de l'utilisateur. Par exemple, pour extraire toutes les valeurs du tableau supprimé
, utilisation:Par exemple, pour récupérer toutes les valeurs dans le supprimé
table, utilisez:
SELECT * FROM supprimé;
Pour plus d'informations, voir Utilisation des tableaux insérés et supprimés.Pour plus d'informations, voir Utiliser les tableaux insérés et supprimés.
Les déclencheurs DDL et de connexion capturent des informations sur l'événement déclencheur à l'aide de la fonction EVENTDATA (Transact-SQL).Les déclencheurs DDL et d'ouverture de session capturent des informations sur l'événement déclencheur à l'aide de la fonction EVENTDATA (Transact-SQL). Pour plus d'informations, voir Utilisation de la fonction EVENTDATA.Pour plus d'informations, voir Utiliser la fonction EVENTDATA.
serveur SQLserveur SQL permet la mise à jour des colonnes texte, ntext, ou image via le déclencheur INSTEAD OF sur des tables ou des vues.permet la mise à jour de texte, ntext, or image colonnes via le déclencheur INSTEAD OF sur des tables ou des vues.
Important
Types de donnéesntext, texte et image sera supprimé dans une version ultérieure de MicrosoftMicrosoftserveur SQLserveur SQL.ntext, texte, et image les types de données seront supprimés dans une future version de MicrosoftMicrosoftserveur SQLserveur SQL. Évitez d'utiliser ces types de données dans un nouveau développement. Prévoyez de modifier les applications qui les utilisent actuellement.Évitez d'utiliser ces types de données dans de nouveaux travaux de développement et prévoyez de modifier les applications qui les utilisent actuellement. Utilisez à la place les types de données nvarchar (max), varchar (max) et varbinary (max).Utilisez plutôt nvarchar (max), varchar (max) et varbinary (max). AFTER et INSTEAD OF déclenchent les deux données de support varchar (MAX) , nvarchar (MAX) et varbinaire (MAX) dans les tableaux insérés et supprimés.Prise en charge des déclencheurs AFTER et INSTEAD OF varchar (MAX), nvarchar (MAX), et varbinaire (MAX) données dans les tableaux insérés et supprimés.
Pour les déclencheurs sur les tables optimisées en mémoire, la seule instruction sql_statement autorisé au niveau supérieur est un bloc ATOMIQUE.Pour les déclencheurs sur des tables optimisées en mémoire, le seul sql_statement autorisé au niveau supérieur est un bloc ATOMIQUE. Le code T-SQL autorisé dans le bloc ATOMIC est limité par le code T-SQL autorisé dans les procédures natives.Le T-SQL autorisé à l'intérieur du bloc ATOMIC est limité par le T-SQL autorisé à l'intérieur des procs natifs.
< method_specifier > S'applique à : SQL Server 2008SQL Server 2008 et ensuite.< method_specifier > S'applique à: SQL Server 2008SQL Server 2008 et ensuite.
Pour un déclencheur CLR, spécifie la méthode de liaison d'un assembly au déclencheur.Pour un déclencheur CLR, spécifie la méthode d'un assembly à lier avec le déclencheur. La méthode ne doit prendre aucun argument et renvoyer une valeur vide.La méthode ne doit prendre aucun argument et retourner void. nom du cours doit être un identifiant serveur SQLserveur SQL valide et doit exister en tant que classe dans l'assembly avec une visibilité d'assembly.nom du cours doit être valide serveur SQLserveur SQL identifiant et doit exister en tant que classe dans l'assembly avec une visibilité d'assembly. Si la classe a un nom qualifié par un espace de noms qui utilise & # 39;. & # 39; pour séparer les parties de l'espace de noms, le nom de la classe doit être placé entre crochets ([ ]) ou des guillemets doubles ("").Si la classe a un nom qualifié d'espace de noms qui utilise & # 39;. & # 39; pour séparer les parties d'espace de noms, le nom de la classe doit être délimité à l'aide de [ ] ou "" délimiteurs. La classe ne peut pas être imbriquée.La classe ne peut pas être une classe imbriquée.
Remarques
Par défaut, la possibilité de serveur SQLserveur SQL pour exécuter le code CLR est désactivé.Par défaut, la capacité de serveur SQLserveur SQL pour exécuter le code CLR est désactivé. Vous pouvez créer, modifier et supprimer des objets de base de données qui référencent des modules de code managé. Cependant, ces références ne s'exécutent pas dans une instance de serveur SQLserveur SQL uniquement si l'option clr enabled est activée à l'aide de sp_configure.Vous pouvez créer, modifier et supprimer des objets de base de données qui référencent des modules de code managé, mais ces références ne s'exécutent pas dans une instance de serveur SQLserveur SQL sauf si l'option clr enabled est activée à l'aide de sp_configure.
Remarques sur les déclencheurs DMLRemarques pour les déclencheurs DML
Les déclencheurs DML sont souvent utilisés pour appliquer les règles de gestion et d'intégrité des données.Les déclencheurs DML sont fréquemment utilisés pour appliquer les règles métier et l'intégrité des données. serveur SQLserveur SQL fournit l'intégrité référentielle déclarative (DRI) via les instructions ALTER TABLE et CREATE TABLE.fournit l'intégrité référentielle déclarative (DRI) via les instructions ALTER TABLE et CREATE TABLE. Cependant, la fonctionnalité DRI ne gère pas l'intégrité référentielle entre les bases de données.Cependant, DRI ne fournit pas l'intégrité référentielle entre les bases de données. L'intégrité référentielle fait référence aux règles appliquées aux relations entre les clés primaires et les clés étrangères des tables.L'intégrité référentielle fait référence aux règles concernant les relations entre les clés primaire et étrangère des tables. Pour appliquer l'intégrité référentielle, utilisez les contraintes PRIMARY KEY et FOREIGN KEY dans les instructions ALTER TABLE et CREATE TABLE.Pour appliquer l'intégrité référentielle, utilisez les contraintes PRIMARY KEY et FOREIGN KEY dans ALTER TABLE et CREATE TABLE. S'il existe des contraintes sur la table de déclenchement, elles sont vérifiées après l'exécution du déclencheur INSTEAD OF et avant celle du déclencheur AFTER.Si des contraintes existent sur la table de déclenchement, elles sont vérifiées après l'exécution du déclencheur INSTEAD OF et avant l'exécution du déclencheur AFTER. Si les contraintes sont violées, les actions du déclencheur INSTEAD OF sont annulées et le déclencheur AFTER n'est pas activé.Si les contraintes sont violées, les actions de déclenchement INSTEAD OF sont annulées et le déclencheur AFTER n'est pas déclenché.
Vous pouvez spécifier le premier et le dernier déclencheur AFTER à exécuter sur une table à l'aide de sp_settriggerorder.Vous pouvez spécifier les premier et dernier déclencheurs AFTER à exécuter sur une table à l'aide de sp_settriggerorder. Vous ne pouvez spécifier qu'un premier et un dernier déclencheur AFTER pour chaque instruction INSERT, UPDATE ou DELETE d'une table.Vous ne pouvez spécifier qu'un premier et un dernier déclencheur AFTER pour chaque opération INSERT, UPDATE et DELETE sur une table. S'il y a d'autres déclencheurs AFTER sur la même table, ils sont exécutés de manière aléatoire.S'il existe d'autres déclencheurs AFTER sur la même table, ils sont exécutés de manière aléatoire.
Si une instruction ALTER TRIGGER modifie un premier ou un dernier déclencheur. Le premier ou le dernier attribut défini sur le déclencheur modifié est supprimé et vous devez réinitialiser la valeur de la commande avec sp_settriggerorder.Si une instruction ALTER TRIGGER modifie un premier ou un dernier déclencheur, le premier ou le dernier attribut défini sur le déclencheur modifié est supprimé et vous devez réinitialiser la valeur de la commande à l'aide de sp_settriggerorder.
Un déclencheur AFTER n'est exécuté qu'après l'exécution correcte de l'instruction de déclencheur SQL.Un déclencheur AFTER n'est exécuté qu'après l'exécution réussie de l'instruction SQL de déclenchement. Cette exécution réussie inclut toutes les actions d'intégrité référentielle en cascade et les contrôles de stress associés à l'objet mis à jour ou supprimé.Cette exécution réussie comprend toutes les actions en cascade référentielles et les vérifications de contraintes associées à l'objet mis à jour ou supprimé. Un déclencheur AFTER n'active pas récursivement un déclencheur INSTEAD OF sur la même table.Un AFTER ne déclenche pas récursivement un déclencheur INSTEAD OF sur la même table.
Si un déclencheur INSTEAD OF défini sur une table exécute une instruction relative à cette table et qui est susceptible de la réactiver, il n'est pas appelé de façon répétée.Si un déclencheur INSTEAD OF défini sur une table exécute une instruction sur la table qui déclencherait normalement à nouveau le déclencheur INSTEAD OF, le déclencheur n'est pas appelé récursivement. L'instruction est traitée comme si la table n'avait pas de déclencheur INSTEAD OF et démarre la chaîne d'opérations de contraintes et d'exécutions du déclencheur AFTER.Au lieu de cela, l'instruction traite comme si la table n'avait pas de déclencheur INSTEAD OF et démarre la chaîne d'opérations de contrainte et d'exécutions de déclencheur AFTER. Par exemple, si un déclencheur est défini comme déclencheur INSTEAD OF INSERT pour une table.Par exemple, si un déclencheur est défini comme déclencheur INSTEAD OF INSERT pour une table. Le déclencheur exécute une instruction INSERT sur la même table et l'instruction INSERT émise par le déclencheur INSTEAD OF n'appelle plus le déclencheur.Et, le déclencheur exécute une instruction INSERT sur la même table, l'instruction INSERT lancée par le déclencheur INSTEAD OF n'appelle pas à nouveau le déclencheur. L'instruction INSERT lancée par le déclencheur démarre le processus d'exécution des actions de contrainte et l'activation de tout déclencheur AFTER INSERT défini pour la table.L'INSERT lancé par le déclencheur démarre le processus d'exécution des actions de contrainte et le déclenchement de tous les déclencheurs AFTER INSERT définis pour la table.
Lorsqu'un déclencheur INSTEAD OF défini sur une vue exécute une instruction relative à cette vue et qui est susceptible de la réactiver, il n'est pas appelé de façon répétée.Lorsqu'un déclencheur INSTEAD OF défini sur une vue exécute une instruction par rapport à la vue qui déclencherait normalement à nouveau le déclencheur INSTEAD OF, il n'est pas appelé récursivement. Au lieu de cela, l'instruction est résolue en tant que modifications apportées aux tables de base sous-jacentes de la vue.Au lieu de cela, l'instruction est résolue en tant que modifications par rapport aux tables de base sous-jacentes à la vue. Dans ce cas, la définition de la vue doit respecter toutes les restrictions applicables à une vue pouvant être mise à jour.Dans ce cas, la définition de la vue doit respecter toutes les restrictions pour une vue pouvant être mise à jour. Pour une définition des vues pouvant être mises à jour, voir Modifier les données à l'aide d'une vue.Pour une définition des vues pouvant être mises à jour, voir Modifier les données via une vue.
Par exemple, si un déclencheur est défini comme déclencheur INSTEAD OF UPDATE pour une vue.Par exemple, si un déclencheur est défini comme déclencheur INSTEAD OF UPDATE pour une vue. Le déclencheur exécute une instruction MISE À JOUR qui référence la même vue et l'instruction MISE À JOUR lancée par le déclencheur AU LIEU de n'appelle pas à nouveau le déclencheur.Et, le déclencheur exécute une instruction UPDATE faisant référence à la même vue, l'instruction UPDATE lancée par le déclencheur INSTEAD OF n'appelle pas à nouveau le déclencheur. Elle est appliquée à la vue comme si celle-ci ne comportait pas de déclencheur AU LIEU DE.La MISE À JOUR lancée par le déclencheur est traitée par rapport à la vue comme si la vue n'avait pas de déclencheur INSTEAD OF. Les colonnes modifiées par l & # 39; instruction MISE À JOUR doivent être résolues en une seule table de base.Les colonnes modifiées par UPDATE doivent être résolues en une seule table de base. Chaque modification d'une table de base sous-jacente déclenchée par la chaîne d'application des contraintes et d'activation des déclencheurs APRÈS définies sur la table.Chaque modification d'une table de base sous-jacente démarre la chaîne d'application des contraintes et de déclenchement des déclencheurs AFTER définis pour la table.
Test des actions UPDATE ou INSERT sur des colonnes spécifiquesTest des actions UPDATE ou INSERT sur des colonnes spécifiques
Vous pouvez créer un déclencheur Transact-SQLTransact-SQL qui effectue certaines actions en fonction des modifications des instructions UPDATE ou INSERT sur des colonnes particulières.Vous pouvez concevoir un Transact-SQLTransact-SQL déclencheur pour effectuer certaines actions basées sur des modifications UPDATE ou INSERT sur des colonnes spécifiques. Pour cela, utilisez UPDATE () ou COLUMNS_UPDATED dans le corps du déclencheur.Utilisez UPDATE () ou COLUMNS_UPDATED dans le corps du déclencheur à cet effet. UPDATE () teste les tentatives UPDATE ou INSERT sur une colonne.UPDATE () teste les tentatives UPDATE ou INSERT sur une colonne. COLUMNS_UPDATED effectue un test pour déterminer si des actions UPDATE ou INSERT sont exécutées sur plusieurs colonnes.COLUMNS_UPDATED teste les actions UPDATE ou INSERT qui s'exécutent sur plusieurs colonnes. Cette fonction retourne un modèle binaire qui indique quelles colonnes ont été insérées ou mises à jour.Cette fonction renvoie un modèle de bits qui indique quelles colonnes ont été insérées ou mises à jour.
Limitations des déclencheursLimitations de déclenchement
CREATE TRIGGER doit être la première instruction du traitement et ne peut être appliquée à une seule table.CREATE TRIGGER doit être la première instruction du lot et ne peut s'appliquer qu'à une seule table.
Un déclencheur n & # 39; est créé que dans la base de données active. Cependant, il peut faire référence aux objets qui se trouvent hors de la base de données actives.Un déclencheur est créé uniquement dans la base de données actuelle; cependant, un déclencheur peut référencer des objets en dehors de la base de données actuelle.
Si le nom du schéma du déclencheur est spécifié pour qualifier le déclencheur, qualifiez le nom de la table de la même façon.Si le nom du schéma du déclencheur est spécifié pour qualifier le déclencheur, qualifiez le nom de la table de la même manière.
La même action de déclencheur peut être définie pour plusieurs actions de l'utilisateur (par exemple, INSERT et UPDATE) dans la même instruction CREATE TRIGGER.La même action de déclenchement peut être définie pour plusieurs actions utilisateur (par exemple, INSERT et UPDATE) dans la même instruction CREATE TRIGGER.
Les déclencheurs AU LIEU DE SUPPRIMER / METTRE À JOUR ne peuvent pas être définis sur une table ayant une clé étrangère pour laquelle une action SUPPRIMER / METTRE À JOUR en cascade est définie.Les déclencheurs INSTEAD OF DELETE / UPDATE ne peuvent pas être définis sur une table qui a une clé étrangère avec une cascade sur l'action DELETE / UPDATE définie.
Vous pouvez afficher n & # 39; importe quelle instruction SET dans le déclencheur.Toute instruction SET peut être spécifiée dans un déclencheur. L & # 39; option SET sélectionnée reste active pendant l & # 39; exécution du déclencheur, puis retrouve sa valeur d & # 39; origine.L'option SET sélectionnée reste en vigueur pendant l'exécution du déclencheur, puis revient à son ancien réglage.
Lorsqu 'un déclencheur est activé, les résultats sont retournés à l'application appelante, comme pour les procédures stockées.Lorsqu'un déclencheur se déclenche, les résultats sont renvoyés à l'application appelante, tout comme avec les procédures stockées. Pour éviter le retour de résultats à une application parce que « un déclencheur est activé, sans inclure pas d'instructions SELECT qui retournent des résultats, ni d'instructions affectant des variables dans un déclencheur.Pour éviter que les résultats ne soient renvoyés à une application en raison du déclenchement d'un déclencheur, n'incluez pas d'instructions SELECT qui renvoient des résultats ou d'instructions qui effectuent l'affectation de variables dans un déclencheur. Un déclencheur qui inclut des instructions SELECT retournant des résultats à l’utilisateur ou des instructions affectant des variables nécessite un traitement spécial.A trigger that includes either SELECT statements that return results to the user or statements that do variable assignment, requires special handling. Vous devriez écrire les résultats renvoyés dans chacune des applications autorisant des modifications de la table du déclencheur.You'd have to write the returned results into every application in which modifications to the trigger table are allowed. Si une affectation de variable doit avoir lieu dans un déclencheur, utilisez l'instruction SET NOCOUNT au début du déclencheur, pour éviter tout retour d'un jeu de résultats.If variable assignment must occur in a trigger, use a SET NOCOUNT statement at the start of the trigger to prevent the return of any result sets.
Bien qu'une instruction TRUNCATE TABLE soit appliquée dans une instruction DELETE, elle n'active pas de déclencheur parce que l'opération n'enregistre pas les suppressions de lignes individuelles.Although a TRUNCATE TABLE statement is in effect a DELETE statement, it doesn't activate a trigger because the operation doesn't log individual row deletions. Toutefois, seuls les utilisateurs disposant d'autorisations permettant d'exécuter une instruction TRUNCATE TABLE doivent se soucier de contourner par inadvertance un déclencheur DELETE de cette façon.However, only those users with permissions to run a TRUNCATE TABLE statement need be concerned about inadvertently circumventing a DELETE trigger this way.
L'instruction WRITETEXT, enregistrée ou non dans le journal, n'active pas un déclencheur.The WRITETEXT statement, whether logged or unlogged, doesn't activate a trigger.
Les instructions Transact-SQLTransact-SQL suivantes ne sont pas autorisées dans un déclencheur DML :The following Transact-SQLTransact-SQL statements aren't allowed in a DML trigger:
ALTER DATABASEALTER DATABASE | CREATE DATABASECREATE DATABASE | DROP DATABASEDROP DATABASE |
RESTORE DATABASERESTORE DATABASE | RESTORE LOGRESTORE LOG | RECONFIGURERECONFIGURE |
De plus, les instructions Transact-SQLTransact-SQL suivantes ne sont pas autorisées dans le corps d'un déclencheur DML lorsque celui-ci est utilisé sur la table ou la vue cible de l'action de déclenchement.Additionally, the following Transact-SQLTransact-SQL statements aren't allowed inside the body of a DML trigger when it's used against the table or view that's the target of the triggering action.
CREATE INDEX (y compris CREATE SPATIAL INDEX et CREATE XML INDEX)CREATE INDEX (including CREATE SPATIAL INDEX and CREATE XML INDEX) | ALTER INDEXALTER INDEX | DROP INDEXDROP INDEX |
DBCC DBREINDEXDBCC DBREINDEX | ALTER PARTITION FUNCTIONALTER PARTITION FUNCTION | DROP TABLEDROP TABLE |
ALTER TABLE quand elle est utilisée pour effectuer les actions suivantes :ALTER TABLE when used to do the following:
ajout, modification ou suppression de colonnes ;Add, modify, or drop columns. changement de partitions ;Switch partitions. ajout ou suppression de contraintes PRIMARY KEY ou UNIQUE.Add or drop PRIMARY KEY or UNIQUE constraints. |
Remarques
SQL ServerSQL Server ne prenant pas en charge les déclencheurs définis par l'utilisateur sur des tables système, nous recommandons de ne pas en créer.Car SQL ServerSQL Server does not support user-defined triggers on system tables, we recommend that you do not create user-defined triggers on system tables.
Optimisation des déclencheurs DMLOptimizing DML Triggers
Les déclencheurs fonctionnent dans des transactions (implicites ou autres). Quand ils sont ouverts, ils verrouillent les ressources.Triggers work in transactions (implied or otherwise) and while they're open, they lock resources. Le verrou reste en place jusqu’à ce que la transaction soit confirmée (avec COMMIT) ou rejetée (avec ROLLBACK).The lock remains in place until the transaction is confirmed (with COMMIT) or rejected (with a ROLLBACK). Plus la durée d’exécution d’un déclencheur est longue, plus le risque de blocage d’un autre processus augmente.The longer a trigger runs, the higher the probability that another process is then blocked. Par conséquent, écrivez les déclencheurs afin de réduire leur durée autant que possible.So, write triggers to lessen their duration whenever possible. Une façon d’y parvenir est de libérer un déclencheur quand une instruction DML ne change aucune ligne.One way to achieve shorter duration is to release a trigger when a DML statement changes zero rows.
Pour libérer un déclencheur dans une commande qui ne change aucune ligne, utilisez la variable système ROWCOUNT_BIG.To release the trigger for a command that doesn't change any rows, employ the system variable ROWCOUNT_BIG.
L’extrait de code T-SQL suivant montre comment libérer le déclencheur pour une commande qui ne modifie aucune ligne.The following T-SQL code snippet shows how to release the trigger for a command that doesn't change any rows. Ce code doit se trouver au début de chaque déclencheur DML :This code should be present at the beginning of each DML trigger:
IF (ROWCOUNT_BIG() = 0)
RETURN;
Remarques sur les déclencheurs DDLRemarks for DDL Triggers
Les déclencheurs DDL, tout comme les déclencheurs standard, lancent des procédures stockées en réponse à un événement.DDL triggers, like standard triggers, launch stored procedures in response to an event. Cependant, à la différence des déclencheurs standard, ils ne s'exécutent pas en réponse aux instructions UPDATE, INSERT ou DELETE sur une table ou sur une vue.But, unlike standard triggers, they don't run in response to UPDATE, INSERT, or DELETE statements on a table or view. Au lieu de cela, ils s'exécutent essentiellement en réponse aux instructions DDL (Data Definition Language).Instead, they primarily run in response to data definition language (DDL) statements. Les types d’instructions incluent CREATE, ALTER, DROP, GRANT, DENY, REVOKE et UPDATE STATISTICS.The statement types include CREATE, ALTER, DROP, GRANT, DENY, REVOKE, and UPDATE STATISTICS. Certaines procédures stockées système qui effectuent des opérations de type DDL peuvent également activer des déclencheurs DDL.Certain system stored procedures that carry out DDL-like operations can also fire DDL triggers.
Important
Testez vos déclencheurs DDL afin de déterminer leurs réponses à l'exécution des procédures stockées système.Test your DDL triggers to determine their responses to system stored procedure execution. Par exemple, l'instruction CREATE TYPE et les procédures stockées sp_addtype et sp_rename activent un déclencheur DDL créé à l'occasion d'un événement CREATE_TYPE.For example, the CREATE TYPE statement and the sp_addtype and sp_rename stored procedures fire a DDL trigger that's created on a CREATE_TYPE event.
Pour plus d’informations sur les déclencheurs DDL, consultez Déclencheurs DDL.For more information about DDL triggers, see DDL Triggers.
Les déclencheurs DDL ne sont pas activés en réponse à des événements qui concernent les tables et les procédures stockées temporaires locales ou globales.DDL triggers don't fire in response to events that affect local or global temporary tables and stored procedures.
À la différence des déclencheurs DML, le champ d'action des déclencheurs DDL ne correspond pas aux schémas.Unlike DML triggers, DDL triggers aren't scoped to schemas. Vous ne pouvez donc pas utiliser de fonctions telles qu’OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY et OBJECTPROPERTYEX pour effectuer des requêtes de métadonnées à propos de déclencheurs DDL.So, you can't use functions such as OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY, and OBJECTPROPERTYEX for querying metadata about DDL triggers. Utilisez plutôt les affichages catalogue.Use the catalog views instead. Pour plus d’informations, consultez Obtenir des informations sur les déclencheurs DDL.For more information, see Get Information About DDL Triggers.
Remarques
Les déclencheurs DDL avec étendue au niveau serveur figurent dans le dossier Déclencheurs de l’Explorateur d’objets SQL Server Management StudioSQL Server Management Studio.Server-scoped DDL triggers appear in the SQL Server Management StudioSQL Server Management Studio Object Explorer in the Déclencheurs dossier. Ce dossier se trouve dans le dossier Objets serveur .This folder is located under the Server Objects dossier. Les déclencheurs DDL délimités à la base de données figurent dans le dossier Déclencheurs de base de données.Database-scoped DDL Triggers appear in the Database Triggers dossier. Ce dossier se trouve dans le dossier Programmabilité de la base de données correspondante.This folder is located under the Programmability folder of the corresponding database.
Déclencheurs de connexionLogon Triggers
Les déclencheurs de connexion exécutent des procédures stockées en réponse à un événement LOGON.Logon triggers carry out stored procedures in response to a LOGON event. Cet événement survient lorsqu'une session utilisateur est établie avec une instance de SQL ServerSQL Server.This event happens when a user session is established with an instance of SQL ServerSQL Server. Les déclencheurs de connexion sont activés au terme de la phase d'authentification de connexion, mais avant l'établissement de la session utilisateur.Logon triggers fire after the authentication phase of logging in finishes, but before the user session is established. Tous les messages provenant du corps du déclencheur et habituellement destinés à l'utilisateur, (les messages et les messages d'erreur de l'instruction PRINT, par exemple), sont donc dirigés vers le journal des erreurs SQL ServerSQL Server .So, all messages originating inside the trigger that would typically reach the user, such as error messages and messages from the PRINT statement, are diverted to the SQL ServerSQL Server error log. Pour plus d’informations, consultez Déclencheurs de connexion.For more information, see Logon Triggers.
Les déclencheurs de connexion ne sont pas activés si l'authentification échoue.Logon triggers don't fire if authentication fails.
Les transactions distribuées ne sont pas prises en charge dans un déclencheur ouverture de session.Distributed transactions aren't supported in a logon trigger. L’erreur 3969 est retournée quand un déclencheur d’ouverture de session qui contient une transaction distribuée est activé.Error 3969 returns when a logon trigger that contains a distributed transaction fire.
Désactivation d'un déclencheur de connexionDisabling a Logon Trigger
Un déclencheur de connexion peut empêcher les connexions au Moteur de base de donnéesDatabase Engine pour tous les utilisateurs, notamment les membres du rôle serveur fixe sysadmin .A logon trigger can effectively prevent successful connections to the Moteur de base de donnéesDatabase Engine for all users, including members of the sysadmin fixed server role. Quand un déclencheur de connexion empêche les connexions, les membres du rôle serveur fixe sysadmin peuvent se connecter à l’aide de la connexion administrateur dédiée, ou en démarrant le Moteur de base de donnéesDatabase Engine en mode de configuration minimale (-f).When a logon trigger is preventing connections, members of the sysadmin fixed server role can connect by using the dedicated administrator connection, or by starting the Moteur de base de donnéesDatabase Engine in minimal configuration mode (-f). Pour plus d’informations, consultez Options de démarrage du service moteur de base de données.For more information, see Database Engine Service Startup Options.
Considérations générales sur les déclencheursGeneral Trigger Considerations
Retour de résultatsReturning Results
Cette possibilité d'obtenir des résultats via des déclencheurs sera supprimée dans les prochaines versions de Microsoft SQL Server.The ability to return results from triggers will be removed in a future version of SQL Server. Les déclencheurs qui renvoient des jeux de résultats peuvent provoquer un comportement inattendu des applications qui ne sont pas conçues pour interagir avec eux.Triggers that return result sets may cause unexpected behavior in applications that aren't designed to work with them. Évitez de renvoyer des jeux de résultats provenant de déclencheurs dans un nouveau travail de développement et prévoyez la modification des applications qui y recourent actuellement.Avoid returning result sets from triggers in new development work, and plan to modify applications that currently do. Pour empêcher les déclencheurs de retourner des jeux de résultats, attribuez la valeur 1 à l’option Interdire les résultats à partir des déclencheurs.To prevent triggers from returning result sets, set the disallow results from triggers option to 1.
Les déclencheurs d’ouverture de session interdisent toujours le renvoi de jeux de résultats et ce comportement n'est pas configurable.Logon triggers always disallow the return of results sets and this behavior isn't configurable. Si un déclencheur d’ouverture de session génère un jeu de résultats, le lancement du déclencheur échoue et la tentative de connexion qui a activé le déclencheur est refusée.If a logon trigger generates a result set, the trigger fails to launch and the login attempt that fired the trigger is denied.
Déclencheurs multiplesMultiple Triggers
SQL ServerSQL Server vous permet de créer plusieurs déclencheurs pour chaque événement DML, DDL ou LOGON.lets you create multiple triggers for each DML, DDL, or LOGON event. Par exemple, si la commande CREATE TRIGGER FOR UPDATE est exécutée pour une table qui comporte déjà un déclencheur UPDATE, un déclencheur de mise à jour supplémentaire est créé.For example, if CREATE TRIGGER FOR UPDATE is run for a table that already has an UPDATE trigger, an additional update trigger is created. Dans les versions antérieures de SQL ServerSQL Server, il n'était possible de créer qu'un seul déclencheur par événement de modification de données INSERT, UPDATE ou DELETE pour chaque table.In earlier versions of SQL ServerSQL Server, only one trigger for each INSERT, UPDATE, or DELETE data modification event is allowed for each table.
Déclencheurs récursifsRecursive Triggers
SQL ServerSQL Server prend également en charge l'appel récursif de déclencheurs lorsque le paramètre RECURSIVE_TRIGGERS est activé au moyen de l'instruction ALTER DATABASE.also supports recursive invocation of triggers when the RECURSIVE_TRIGGERS setting is enabled using ALTER DATABASE.
Les déclencheurs récursifs permettent les types de récurrence suivants :Recursive triggers enable the following types of recursion to occur:
-
Récurrence indirecte.Indirect recursion
Avec la récurrence indirecte, une application met à jour la table T1.With indirect recursion, an application updates table T1. Cela active le déclencheur TR1, avec pour conséquence la mise à jour de la table T2.This fires trigger TR1, updating table T2. Le déclencheur T2 est alors activé et met à jour la table T1.Trigger T2 then fires and updates table T1.
-
Récurrence directe.Direct recursion
En récurrence directe, l'application met à jour la table T1.In direct recursion, the application updates table T1. Cela active le déclencheur TR1, avec pour conséquence la mise à jour de la table T1.This fires trigger TR1, updating table T1. La table T1 ayant été mise à jour, le déclencheur TR1 est réactivé, etc.Because table T1 was updated, trigger TR1 fires again, and so on.
L'exemple suivant illustre l'utilisation de la récurrence directe et indirecte. Supposons que deux déclencheurs de mise à jour, TR1 et TR2, soient définis sur la table T1.The following example uses both indirect and direct trigger recursion Assume that two update triggers, TR1 and TR2, are defined on table T1. Le déclencheur TR1 met à jour la table T1 de manière récursive.Trigger TR1 updates table T1 recursively. Une instruction UPDATE exécute chaque déclencheur TR1 et TR2 une fois.An UPDATE statement runs each TR1 and TR2 one time. De plus, le lancement de TR1 déclenche l'exécution de TR1 (de manière récursive) et de TR2.Additionally, the launch of TR1 triggers the execution of TR1 (recursively) and TR2. Les tables inserted et deleted d'un déclencheur donné contiennent des lignes qui ne correspondent qu'à l'instruction UPDATE qui a appelé le déclencheur.The inserted and deleted tables for a specific trigger contain rows that correspond only to the UPDATE statement that invoked the trigger.
Remarques
Le comportement précédent se produit uniquement si le paramètre RECURSIVE_TRIGGERS est activé au moyen de l'instruction ALTER DATABASE.The previous behavior occurs only if the RECURSIVE_TRIGGERS setting is enabled by using ALTER DATABASE. Les différents déclencheurs définis pour un événement donné ne sont pas exécutés dans un ordre défini.There's no defined order in which multiple triggers defined for a specific event are run. Chaque déclencheur doit être indépendant.Each trigger should be self-contained.
La désactivation du paramètre RECURSIVE_TRIGGERS empêche uniquement les récurrences directes.Disabling the RECURSIVE_TRIGGERS setting only prevents direct recursions. Pour désactiver également la récurrence indirecte, affectez la valeur 0 à l'option de serveur nested triggers à l'aide de sp_configure.To disable indirect recursion also, set the nested triggers server option to 0 by using sp_configure.
Si un des déclencheurs effectue une opération ROLLBACK TRANSACTION, quel que soit le niveau d'imbrication, aucun autre déclencheur n'est exécuté.If any one of the triggers carries out a ROLLBACK TRANSACTION, regardless of the nesting level, no more triggers are run.
Déclencheurs imbriquésNested Triggers
Vous pouvez imbriquer des déclencheurs sur 32 niveaux maximum.You can nest triggers to a maximum of 32 levels. Si un déclencheur modifie une table dans laquelle il y a un autre déclencheur, le second déclencheur est activé et peut en appeler un troisième, etc.If a trigger changes a table on which there's another trigger, the second trigger activates and can then call a third trigger, and so on. Si un des déclencheurs de la chaîne provoque une boucle infinie, le niveau d'imbrication maximal est dépassé et le déclencheur est annulé.If any trigger in the chain sets off an infinite loop, the nesting level is exceeded and the trigger is canceled. Lorsqu'un déclencheur Transact-SQLTransact-SQL lance du code managé en référençant une routine, un type ou un agrégat CLR, cette référence compte comme un seul niveau pour le calcul de la limite des 32 niveaux d'imbrication.When a Transact-SQLTransact-SQL trigger launches managed code by referencing a CLR routine, type, or aggregate, this reference counts as one level against the 32-level nesting limit. Les méthodes appelées à partir du code managé ne comptent pas par rapport à cette limite.Methods invoked from within managed code don't count against this limit.
Pour désactiver les déclencheurs imbriqués, attribuez la valeur 0 (off) à l'option nested triggers de sp_configure.To disable nested triggers, set the nested triggers option of sp_configure to 0 (off). La configuration par défaut prend en charge les déclencheurs imbriqués.The default configuration supports nested triggers. Si l’option des déclencheurs imbriqués est désactivée, les déclencheurs récursifs le sont également, malgré le paramètre RECURSIVE_TRIGGERS défini avec l’instruction ALTER DATABASE.If nested triggers are off, recursive triggers are also disabled, despite the RECURSIVE_TRIGGERS setting that's set by using ALTER DATABASE.
Le premier déclencheur AFTER imbriqué dans un déclencheur INSTEAD OF se déclenche même si l’option de configuration de serveur nested triggers est 0.The first AFTER trigger nested inside an INSTEAD OF trigger fires even if the nested triggers server configuration option is 0. Toutefois, les déclencheurs AFTER suivants ne sont pas activés avec ce paramètre.But, under this setting, the later AFTER triggers don't fire. Vérifiez si vos applications contiennent des déclencheurs imbriqués pour déterminer si elles sont conformes aux règles de votre entreprise lorsque la configuration du serveur déclencheurs imbriqués est définie sur 0.Review your applications for nested triggers to determine if the applications follow your business rules when the nested triggers server configuration option is set to 0. Si ce n’est pas le cas, apportez les modifications appropriées.If not, make the appropriate modifications.
Résolution de noms différéeDeferred Name Resolution
SQL ServerSQL Server permet aux procédures stockées, aux déclencheurs et aux lots d'instructions Transact-SQLTransact-SQL de faire référence à des tables qui n'existent pas au moment de la compilation.allows for Transact-SQLTransact-SQL stored procedures, triggers, and batches to refer to tables that don't exist at compile time. Cette fonction s'appelle la résolution différée des noms.This ability is called deferred name resolution.
AutorisationsPermissions
La création d'un déclencheur DML nécessite l'autorisation ALTER sur la table ou la vue sur laquelle le déclencheur est créé.To create a DML trigger, it requires ALTER permission on the table or view on which the trigger is being created.
La création d'un déclencheur DDL avec une étendue de serveur (ON ALL SERVER) ou d’un déclencheur de connexion nécessite l'autorisation CONTROL SERVER sur le serveur.To create a DDL trigger with server scope (ON ALL SERVER) or a logon trigger, requires CONTROL SERVER permission on the server. La création d'un déclencheur DDL avec l'étendue de la base de données (ON DATABASE) nécessite l'autorisation ALTER ANY DATABASE DDL TRIGGER sur la base de données active.To create a DDL trigger with database scope (ON DATABASE), requires ALTER ANY DATABASE DDL TRIGGER permission in the current database.
ExemplesExamples
R.UNE. Utilisation d'un déclencheur DML avec un message de rappelUsing a DML trigger with a reminder message
Le déclencheur DML suivant affiche un message à destination du client lorsque quelqu'un essaye d'ajouter ou de modifier des données dans la table Customer
de la base de données AdventureWorks2012AdventureWorks2012.The following DML trigger prints a message to the client when anyone tries to add or change data in the Customer
table in the AdventureWorks2012AdventureWorks2012 database.
CREATE TRIGGER reminder1
ON Sales.Customer
AFTER INSERT, UPDATE
AS RAISERROR ('Notify Customer Relations', 16, 10);
GO
B.B. Utilisation d'un déclencheur DML avec un message de rappel par courrier électroniqueUsing a DML trigger with a reminder e-mail message
L'exemple suivant envoie un message électronique à une personne spécifiée (MaryM
) lorsque la table Customer
est modifiée.The following example sends an e-mail message to a specified person (MaryM
) when the Customer
table changes.
CREATE TRIGGER reminder2
ON Sales.Customer
AFTER INSERT, UPDATE, DELETE
AS
EXEC msdb.dbo.sp_send_dbmail
@profile_name = 'AdventureWorks2012 Administrator',
@recipients = 'danw@Adventure-Works.com',
@body = 'Don''t forget to print a report for the sales force.',
@subject = 'Reminder';
GO
C.C. Utilisation d'un déclencheur DML AFTER pour imposer une règle de gestion entre les tables PurchaseOrderHeader et VendorUsing a DML AFTER trigger to enforce a business rule between the PurchaseOrderHeader and Vendor tables
Les contraintes CHECK pouvant référencer uniquement les colonnes sur lesquelles des contraintes de niveau table ou colonne sont définies, vous devez définir toutes les contraintes entre tables (dans ce cas, des règles de gestion) sous la forme de déclencheurs.Because CHECK constraints reference only the columns on which the column-level or table-level constraint is defined, you must define any cross-table constraints (in this case, business rules) as triggers.
L'exemple suivant crée un déclencheur DML dans la base de données AdventureWorks2012.The following example creates a DML trigger in the AdventureWorks2012 database. Ce déclencheur vérifie que les informations de conditions de crédit du fournisseur sont correctes (pas 5) lors d’une tentative d’insertion d’un nouveau bon de commande dans la table PurchaseOrderHeader
.This trigger checks to make sure the credit rating for the vendor is good (not 5) when there's an attempt to insert a new purchase order into the PurchaseOrderHeader
table. Pour obtenir les informations de conditions de crédit du fournisseur, la table Vendeur
doit être référencée.To get the credit rating of the vendor, the Vendeur
table must be referenced. Si les conditions de crédit sont trop faibles, un message s'affiche et l'insertion n'a pas lieu.If the credit rating is too low, a message appears and the insertion doesn't happen.
-- This trigger prevents a row from being inserted in the Purchasing.PurchaseOrderHeader
-- table when the credit rating of the specified vendor is set to 5 (below average).
CREATE TRIGGER Purchasing.LowCredit ON Purchasing.PurchaseOrderHeader
AFTER INSERT
AS
IF (ROWCOUNT_BIG() = 0)
RETURN;
IF EXISTS (SELECT *
FROM Purchasing.PurchaseOrderHeader AS p
JOIN inserted AS i
ON p.PurchaseOrderID = i.PurchaseOrderID
JOIN Purchasing.Vendor AS v
ON v.BusinessEntityID = p.VendorID
WHERE v.CreditRating = 5
)
BEGIN
RAISERROR ('A vendor''s credit rating is too low to accept new
purchase orders.', 16, 1);
ROLLBACK TRANSACTION;
REVENIR
END;
GO
-- This statement attempts to insert a row into the PurchaseOrderHeader table
-- for a vendor that has a below average credit rating.
-- The AFTER INSERT trigger is fired and the INSERT transaction is rolled back.
INSERT INTO Purchasing.PurchaseOrderHeader (RevisionNumber, Status, EmployeeID,
VendorID, ShipMethodID, OrderDate, ShipDate, SubTotal, TaxAmt, Freight)
VALUES (
2
,3
,261
,1652
,4
,GETDATE()
,GETDATE()
,44594.55
,3567.564
,1114.8638 );
GO
D.D. Utilisation d'un déclencheur DDL avec une étendue de base de donnéesUsing a database-scoped DDL trigger
L'exemple suivant utilise un déclencheur DDL pour empêcher la suppression d'un synonyme dans une base de données.The following example uses a DDL trigger to prevent any synonym in a database from being dropped.
CREATE TRIGGER safety
ON DATABASE
FOR DROP_SYNONYM
AS
IF (@@ROWCOUNT = 0)
RETURN;
RAISERROR ('You must disable Trigger "safety" to remove synonyms!', 10, 1)
ROLLBACK
GO
DROP TRIGGER safety
ON DATABASE;
GO
E.E. Utilisation d'un déclencheur DDL avec une étendue de serveurUsing a server-scoped DDL trigger
L'exemple suivant utilise un déclencheur DDL pour imprimer un message si un événement CREATE DATABASE se produit sur l'instance de serveur active. Il utilise la fonction EVENTDATA
pour récupérer le texte de l'instruction Transact-SQLTransact-SQL correspondante.The following example uses a DDL trigger to print a message if any CREATE DATABASE event occurs on the current server instance, and uses the EVENTDATA
function to retrieve the text of the corresponding Transact-SQLTransact-SQL statement. Pour obtenir d’autres exemples d’utilisation d’EVENTDATA dans des déclencheurs DDL, consultez Utiliser la fonction EVENTDATA.For more examples that use EVENTDATA in DDL triggers, see Use the EVENTDATA Function.
S’applique à : SQL Server 2008SQL Server 2008 et versions ultérieures.Applies to: SQL Server 2008SQL Server 2008 and later.
CREATE TRIGGER ddl_trig_database
ON ALL SERVER
FOR CREATE_DATABASE
AS
PRINT 'Database Created.'
SELECT EVENTDATA().value('(/EVENT_INSTANCE/TSQLCommand/CommandText)[1]','nvarchar(max)')
GO
DROP TRIGGER ddl_trig_database
ON ALL SERVER;
GO
F.F. Utilisation d'un déclencheur de connexionUsing a logon trigger
L’exemple de déclencheur de connexion suivant refuse une tentative de connexion à SQL ServerSQL Server en tant que membre de la connexion login_test si trois sessions utilisateur sont déjà en cours d’exécution sous cette connexion.The following logon trigger example denies an attempt to log in to SQL ServerSQL Server as a member of the login_test login if there are already three user sessions running under that login.
S’applique à : SQL Server 2008SQL Server 2008 et versions ultérieures.Applies to: SQL Server 2008SQL Server 2008 and later.
USE master;
GO
CREATE LOGIN login_test WITH PASSWORD = '3KHJ6dhx(0xVYsdf' MUST_CHANGE,
CHECK_EXPIRATION = ON;
GO
GRANT VIEW SERVER STATE TO login_test;
GO
CREATE TRIGGER connection_limit_trigger
ON ALL SERVER WITH EXECUTE AS 'login_test'
FOR LOGON
AS
BEGIN
IF ORIGINAL_LOGIN()= 'login_test' ET
(SELECT COUNT(*) FROM sys.dm_exec_sessions
WHERE is_user_process = 1 AND
original_login_name = 'login_test') > 3
ROLLBACK;
END;
G.G. Affichage des événements qui provoquent l'activation d'un déclencheurViewing the events that cause a trigger to fire
L'exemple suivant effectue une requête sur les affichages catalogue sys.triggers
et sys.trigger_events
pour déterminer les événements de langage Transact-SQLTransact-SQL qui provoquent l'activation du déclencheur sécurité
.The following example queries the sys.triggers
et sys.trigger_events
catalog views to determine which Transact-SQLTransact-SQL language events cause trigger sécurité
to fire. Le déclencheur, sécurité
, est créé dans l’exemple D, situé ci-dessus.The trigger, sécurité
, is created in example 'D', found above.
SELECT TE.*
FROM sys.trigger_events AS TE
JOIN sys.triggers AS T ON T.object_id = TE.object_id
WHERE T.parent_class = 0 AND T.name = 'safety';
GO
Voir aussiVoir également
ALTER TABLE (Transact-SQL) ALTER TABLE (Transact-SQL)
ALTER TRIGGER (Transact-SQL) ALTER TRIGGER (Transact-SQL)
COLUMNS_UPDATED (Transact-SQL) COLUMNS_UPDATED (Transact-SQL)
CREATE TABLE (Transact-SQL) CREATE TABLE (Transact-SQL)
DROP TRIGGER (Transact-SQL) DROP TRIGGER (Transact-SQL)
ENABLE TRIGGER (Transact-SQL) ENABLE TRIGGER (Transact-SQL)
DISABLE TRIGGER (Transact-SQL) DISABLE TRIGGER (Transact-SQL)
TRIGGER_NESTLEVEL (Transact-SQL) TRIGGER_NESTLEVEL (Transact-SQL)
EVENTDATA (Transact-SQL) EVENTDATA (Transact-SQL)
sys.dm_sql_referenced_entities (Transact-SQL) sys.dm_sql_referenced_entities (Transact-SQL)
sys.dm_sql_referencing_entities (Transact-SQL) sys.dm_sql_referencing_entities (Transact-SQL)
sys.sql_expression_dependencies (Transact-SQL) sys.sql_expression_dependencies (Transact-SQL)
sp_help (Transact-SQL) sp_help (Transact-SQL)
sp_helptrigger (Transact-SQL) sp_helptrigger (Transact-SQL)
sp_helptext (Transact-SQL) sp_helptext (Transact-SQL)
sp_rename (Transact-SQL) sp_rename (Transact-SQL)
sp_settriggerorder (Transact-SQL) sp_settriggerorder (Transact-SQL)
UPDATE() (Transact-SQL) UPDATE() (Transact-SQL)
Obtenir des informations sur les déclencheurs DML Get Information About DML Triggers
Obtenir des informations sur les déclencheurs DDL Get Information About DDL Triggers
sys.triggers (Transact-SQL) sys.triggers (Transact-SQL)
sys.trigger_events (Transact-SQL) sys.trigger_events (Transact-SQL)
sys.sql_modules (Transact-SQL) sys.sql_modules (Transact-SQL)
sys.assembly_modules (Transact-SQL) sys.assembly_modules (Transact-SQL)
sys.server_triggers (Transact-SQL) sys.server_triggers (Transact-SQL)
sys.server_trigger_events (Transact-SQL) sys.server_trigger_events (Transact-SQL)
sys.server_sql_modules (Transact-SQL) sys.server_sql_modules (Transact-SQL)
sys.server_assembly_modules (Transact-SQL)sys.server_assembly_modules (Transact-SQL)
<! – ->
Commentaires
Laisser un commentaire