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).
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 associé au déclencheur DML. Les déclencheurs DML sont limités à la table ou à la vue dans 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 les 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 intervient sur le serveur actif, quel que soit l'emplacement.WITH ENCRYPTION
Permet de crypter les entrées sys.syscomments sys.sql_modules. Elles contiennent 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é dans 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énéments valides pour les déclencheurs DDL sont répertoriés dans Groupes d'événements DDL. Après l'exécution de l'instruction ALTER TRIGGER, event_group fait également office de macro. Elle rajoute les types d'événements pris en compte dans 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. Pour plus d'informations, consultez Contrôle des contraintes, des identités et des déclencheurs avec l'option NOT FOR REPLICATION.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 transmettre aucun argument et doit 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 une classe imbriquée.
Notes
Pour plus d'informations sur ALTER TRIGGER, consultez la section Remarques dans CREATE TRIGGER (Transact-SQL).
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).
Les premiers et les derniers déclencheurs AFTER à être exécuter sur une table peuvent être spécifiés à 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 Obtention d'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 AdventureWorks;
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 AdventureWorks;
GO
ALTER TRIGGER Sales.bonus_reminder
ON Sales.SalesPersonQuotaHistory
AFTER INSERT
AS RAISERROR ('Notify Compensation', 16, 10);
GO
Voir aussi