Déclencheurs INSTEAD OF UPDATE
Les déclencheurs INSTEAD OF UPDATE peuvent être définis sur une vue ou une table pour remplacer l'action standard de l'instruction UPDATE. Ils sont généralement définis sur une vue pour modifier des données dans une ou plusieurs tables de base.
Une instruction UPDATE qui fait référence à une vue dotée d'un déclencheur INSTEAD OF UPDATE doit fournir des valeurs pour toutes les colonnes de vue n'acceptant pas les valeurs NULL et référencées dans la clause SET, et notamment celles qui font référence à des colonnes de la table de base pour lesquelles aucune valeur d'entrée ne peut être spécifiée :
- colonnes calculées de la table de base ;
- colonnes d'identité de la table de base pour lesquelles IDENTITY_INSERT est désactivée (OFF) ;
- colonnes de la table de base dont le type de données est timestamp.
Généralement, lorsqu'une instruction UPDATE qui fait référence à une table tente de définir la valeur d'une colonne calculée, d'identité ou timestamp, une erreur est générée car les valeurs de ces colonnes doivent être déterminées par SQL Server 2005. Ces colonnes doivent être incluses dans l'instruction UPDATE afin de satisfaire l'exigence NOT NULL de la colonne. Toutefois, si l'instruction UPDATE fait référence à une vue dotée d'un déclencheur INSTEAD OF UPDATE, la logique définie dans le déclencheur peut ignorer ces colonnes et éviter l'erreur. Pour cela, le déclencheur INSTEAD OF UPDATE ne doit pas essayer de mettre à jour les valeurs des colonnes correspondantes dans la table de base. Pour ce faire, n'incluez pas les colonnes dans la clause SET de l'instruction UPDATE. Lors du traitement d'un enregistrement à partir de la table inserted, il se peut que la colonne calculée, d'identité ou timestamp contienne une valeur factice pour satisfaire l'exigence NOT NULL de la colonne, mais le déclencheur INSTEAD OF UPDATE ignore ces valeurs et les valeurs correctes sont définies par SQL Server.
Cette solution fonctionne parce qu'un déclencheur INSTEAD OF UPDATE n'a pas besoin de traiter les données issues des colonnes inserted non mises à jour. Dans la table inserted passée à un déclencheur INSTEAD OF UPDATE, les colonnes spécifiées dans la clause SET respectent les mêmes règles que les colonnes inserted dans un déclencheur INSTEAD OF INSERT. Concernant les colonnes non spécifiées dans la clause SET, les valeurs contenues dans la table inserted sont celles qui existaient avant l'émission de l'instruction UPDATE. Le déclencheur peut tester si une colonne donnée a été mise à jour à l'aide de la clause IF UPDATE(column). Pour plus d'informations, consultez Déclencheurs INSTEAD OF INSERT.
Il doit utiliser les valeurs fournies pour les colonnes calculées, d'identité ou timestamp uniquement dans le cas d'une recherche au moyen de la clause WHERE.
La logique que doit suivre le déclencheur INSTEAD OF UPDATE sur une vue afin de traiter les valeurs mises à jour fournies pour les colonnes calculées, d'identité, timestamp ou par défaut est la même que celle appliquée aux valeurs insérées pour ces types de colonnes.
Remarque : |
---|
Les déclencheurs INSTEAD OF UPDATE ne peuvent pas être définis sur une table qui a une clé étrangère définie au moyen d'une action UPDATE. |
Voir aussi
Concepts
Utilisation des déclencheurs INSTEAD OF