Partager via


ALTER TRIGGER (Transact-SQL)

Modifie la définition d'un déclencheur DML, DDL ou de connexion précédemment créé à l'aide de l'instruction CREATE TRIGGER. Les déclencheurs sont créés à l'aide de la commande CREATE TRIGGER. Ils peuvent être créés directement à partir d'instructions Transact-SQL ou de méthodes d'assembly créées dans le CLR (Common Language Runtime) Microsoft .NET Framework et téléchargées vers une instance de SQL Server. Pour plus d'informations sur les paramètres de l'instruction ALTER TRIGGER, consultez CREATE TRIGGER (Transact-SQL).

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

Syntaxe

Trigger on an INSERT, UPDATE, or DELETE statement to a table or view (DML Trigger)
ALTER TRIGGER schema_name.trigger_name 
ON ( table | view ) 
[ WITH <dml_trigger_option> [ ,...n ] ]
(FOR | AFTER | INSTEAD OF ) 
{ [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } 
[ NOT FOR REPLICATION ] 
AS { sql_statement [ ; ] [ ...n ] | EXTERNAL NAME <method specifier> [ ; ] } 

<dml_trigger_option> ::=
    [ ENCRYPTION ]
    [ <EXECUTE AS Clause> ]

<method_specifier> ::=
    assembly_name.class_name.method_name

Trigger on a CREATE, ALTER, DROP, GRANT, DENY, REVOKE, or UPDATE statement (DDL Trigger)

ALTER TRIGGER trigger_name 
ON { DATABASE | ALL SERVER } 
[ WITH <ddl_trigger_option> [ ,...n ] ]
{ FOR | AFTER } { event_type [ ,...n ] | event_group } 
AS { sql_statement [ ; ] | EXTERNAL NAME <method specifier> 
[ ; ] }
} 

<ddl_trigger_option> ::=
    [ ENCRYPTION ]
    [ <EXECUTE AS Clause> ]

<method_specifier> ::=
    assembly_name.class_name.method_name

Trigger on a LOGON event (Logon Trigger)
ALTER TRIGGER trigger_name 
ON ALL SERVER 
[ WITH <logon_trigger_option> [ ,...n ] ]
{ FOR| AFTER } LOGON 
AS { sql_statement  [ ; ] [ ,...n ] | EXTERNAL NAME < method specifier >  [ ; ] }

<logon_trigger_option> ::=
    [ ENCRYPTION ]
    [ EXECUTE AS Clause ]

<method_specifier> ::=
    assembly_name.class_name.method_name

Arguments

  • schema_name
    Nom du schéma auquel appartient le déclencheur DML. La portée des déclencheurs DML se limite au schéma de la table ou de la vue sur laquelle ils sont créés. schema_name est facultatif uniquement si le déclencheur DML et sa table ou vue correspondante appartiennent au schéma par défaut. schema_name ne peut pas être spécifié pour des déclencheurs DDL ou de connexion.

  • trigger_name
    Déclencheur existant à modifier.

  • table | view
    Table ou vue sur laquelle le déclencheur DML est exécuté. La spécification du nom qualifié complet de la table ou de la vue est facultative.

  • DATABASE
    Applique l'étendue d'un déclencheur DDL à la base de données actuelle. S'il est spécifié, le déclencheur est activé lorsque event_type ou event_group se produit dans la base de données active.

  • ALL SERVER
    Applique l'étendue d'un déclencheur DDL ou de connexion au serveur actif. S'il est spécifié, le déclencheur est activé lorsque event_type ou event_group se produit à un endroit quelconque dans le serveur actif.

  • WITH ENCRYPTION
    Chiffre les entrées sys.syscomments sys.sql_modules contenant le texte de l'instruction ALTER TRIGGER. L'utilisation de l'argument WITH ENCRYPTION évite la publication du déclencheur dans le cadre de la réplication SQL Server. WITH ENCRYPTION ne peut pas être spécifié pour les déclencheurs CLR.

    [!REMARQUE]

    Si un déclencheur est créé en utilisant WITH ENCRYPTION, il doit être spécifié de nouveau dans l'instruction ALTER TRIGGER pour que cette option reste activée.

  • EXECUTE AS
    Spécifie le contexte de sécurité dans lequel le déclencheur est exécuté. Vous permet de contrôler le compte utilisateur utilisé par l'instance de SQL Server pour valider les autorisations sur tous les objets de la base de données référencés par le déclencheur.

    Pour plus d'informations, consultez Clause EXECUTE AS (Transact-SQL).

  • AFTER
    Spécifie que le déclencheur est activé uniquement après l'exécution normale de l'instruction SQL de déclenchement. Toutes les actions CASCADE et les vérifications des contraintes de référence doivent également avoir été exécutées sans erreur pour que ce déclencheur puisse être exécuté.

    AFTER est la valeur par défaut, uniquement si le mot clé FOR est spécifié.

    Les déclencheurs DML AFTER peuvent être définis uniquement sur des tables.

  • INSTEAD OF
    Spécifie que le déclencheur est exécuté au lieu de l'instruction SQL de déclenchement, ce qui supplante les actions des instructions de déclenchement. Il n'est pas possible de spécifier INSTEAD OF pour des déclencheurs DDL ou de connexion.

    Il est possible de définir au plus un déclencheur INSTEAD OF par instruction INSERT, UPDATE ou DELETE sur une table ou une vue. Toutefois, vous pouvez définir des vues sur des vues possédant chacune son propre déclencheur INSTEAD OF.

    Les déclencheurs INSTEAD OF ne sont pas autorisés sur les vues créées à l'aide de WITH CHECK OPTION. SQL Server génère une erreur si un déclencheur INSTEAD OF est ajouté à une vue pour laquelle l'option WITH CHECK OPTION a été spécifiée. L'utilisateur doit supprimer cette option à l'aide d'ALTER VIEW avant de définir le déclencheur INSTEAD OF.

  • { [ DELETE ] [ , ] [ INSERT ] [ , ] [ UPDATE ] } | { [INSERT ] [ , ] [ UPDATE ] }
    Spécifie quelles instructions de modification des données activent le déclencheur DML lorsqu'elles sont exécutées sur cette table ou vue. Vous devez spécifier au moins une option. Vous pouvez combiner toutes les options dans n'importe quel ordre dans la définition du déclencheur. Si plusieurs options sont spécifiées, séparez-les par des virgules.

    Dans le cas des déclencheurs INSTEAD OF, l'option DELETE n'est pas autorisée sur les tables dont la relation référentielle définit 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 définit une action en cascade ON UPDATE. Pour plus d'informations, consultez ALTER TABLE (Transact-SQL).

  • event_type
    Nom d'un événement de langage Transact-SQL qui, après exécution, entraîne l'exécution d'un déclencheur DDL. Les événements valides pour les déclencheurs DDL sont répertoriés dans Événements DDL.

  • event_group
    Nom d'un groupe prédéfini d'événements du langage Transact-SQL. Le déclencheur DDL est activé après l'exécution de n'importe quel événement du langage Transact-SQL 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. Après la fin de l'exécution d'ALTER TRIGGER, event_group agit comme une macro en ajoutant les types d'événements qu'il couvre à l'affichage catalogue sys.trigger_events.

  • NOT FOR REPLICATION
    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_statement
    Conditions et actions du déclencheur.

  • <method_specifier>
    Spécifie les méthodes d'un assembly à lier avec le déclencheur. La méthode ne doit prendre aucun argument et retourner une valeur vide. class_name doit être un identificateur SQL Server valide et doit exister en tant que classe dans l'assembly avec une visibilité d'assembly. La classe ne peut pas être imbriquée.

Notes

Pour plus d'informations sur ALTER TRIGGER, consultez la section Notes dans CREATE TRIGGER (Transact-SQL).

[!REMARQUE]

Les options EXTERNAL_NAME et ON_ALL_SERVER ne sont pas disponibles dans une base de données à relation contenant-contenu.

Déclencheurs DML

ALTER TRIGGER gère manuellement les vues qui peuvent être mises à jour par le biais de déclencheurs INSTEAD OF sur des tables et des vues. SQL Server applique ALTER TRIGGER de la même manière pour tous les types de déclencheurs (AFTER, INSTEAD-OF).

Vous pouvez spécifier le premier et le dernier déclencheurs AFTER à exécuter sur une table à l'aide de sp_settriggerorder. Seuls le premier et le dernier déclencheur AFTER peuvent être spécifiés sur une table. S'il existe d'autres déclencheurs AFTER sur la même table, ils sont exécutés de façon 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 la valeur du rang d'exécution doit être réinitialisée avec sp_settriggerorder.

Un déclencheur AFTER est exécuté seulement après que l'instruction SQL de déclenchement se soit exécutée correctement. Cette exécution réussie inclut toutes les actions référentielles en cascade et les vérifications de contrainte associées à l'objet mis à jour ou supprimé. L'opération du déclencheur AFTER vérifie les effets de l'instruction de déclenchement, ainsi que toutes les actions UPDATE et DELETE référentielles en cascade générées par cette dernière.

Lorsqu'une action DELETE sur une table enfant ou une table de référence résulte d'une instruction DELETE en cascade depuis une table parente, et qu'un déclencheur INSTEAD OF est défini sur DELETE dans la table enfant, le déclencheur est ignoré et l'action DELETE est exécutée.

Déclencheurs DDL

Contrairement aux déclencheurs DML, les déclencheurs DDL n'ont pas l'étendue de schémas. OBJECT_ID, OBJECT_NAME, OBJECTPROPERTY et OBJECTPROPERTY(EX) ne peuvent donc pas être utilisés lors de requêtes sur les métadonnées concernant les déclencheurs DDL. Utilisez les affichages catalogue à la place. Pour plus d'informations, consultez Obtenir des informations sur les déclencheurs DDL.

Autorisations

La modification d'un déclencheur DML nécessite une autorisation ALTER sur la table ou la vue sur laquelle le déclencheur est défini.

La modification d'un déclencheur DDL défini avec une étendue de serveur (ON ALL SERVER) ou d'un déclencheur de connexion nécessite l'autorisation CONTROL SERVER sur le serveur. Modifier un déclencheur DDL défini avec une étendue de base de données (ON DATABASE) nécessite une autorisation ALTER ANY DATABASE DDL TRIGGER sur la base de données active.

Exemples

L'exemple suivant crée un déclencheur DML qui envoie un message défini par l'utilisateur au client lorsqu'un utilisateur tente d'ajouter ou de modifier les données de la table SalesPersonQuotaHistory. Le déclencheur est ensuite modifié à l'aide de l'instruction ALTER TRIGGER pour n'appliquer le déclencheur qu'aux activités INSERT. Ce déclencheur est utile car il rappelle à l'utilisateur qui met à jour ou insère des lignes dans cette table de notifier également le département Compensation.

USE AdventureWorks2012;
GO
IF OBJECT_ID(N'Sales.bonus_reminder', N'TR') IS NOT NULL
    DROP TRIGGER Sales.bonus_reminder;
GO
CREATE TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
WITH ENCRYPTION
AFTER INSERT, UPDATE 
AS RAISERROR ('Notify Compensation', 16, 10);
GO
-- Now, change the trigger.
USE AdventureWorks2012;
GO
ALTER TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
AFTER INSERT
AS RAISERROR ('Notify Compensation', 16, 10);
GO

Voir aussi

Référence

DROP TRIGGER (Transact-SQL)

ENABLE TRIGGER (Transact-SQL)

DISABLE TRIGGER (Transact-SQL)

EVENTDATA (Transact-SQL)

sp_helptrigger (Transact-SQL)

sp_addmessage (Transact-SQL)

sys.triggers (Transact-SQL)

sys.trigger_events (Transact-SQL)

sys.sql_modules (Transact-SQL)

sys.assembly_modules (Transact-SQL)

sys.server_triggers (Transact-SQL)

sys.server_trigger_events (Transact-SQL)

sys.server_sql_modules (Transact-SQL)

sys.server_assembly_modules (Transact-SQL)

Concepts

Créer une procédure stockée

Transactions

Obtenir des informations sur les déclencheurs DML

Obtenir des informations sur les déclencheurs DDL

Modifier le schéma dans les bases de données de publication