Comportement des triggersurs "AFTER INSERT, UPDATE" dans SQL Server

Dans SQL Server 2008, j'ai un scénario où j'ai une table avec une validation complexe lors de l'insertion / mise à jour. Cela inclut la nécessité de convertir une input XML dans une table afin de valider ses données par rapport à une table permanente.

Cependant, j'ai aussi le scénario où je mettrai souvent à jour des colonnes entières simples qui ne nécessitent aucune validation. D'après ce que j'ai lu ici , il semble que SQL Server va renvoyer la ligne entière dans la table «insérée» temp in-memory, pas seulement les colonnes affectées, lorsque j'effectue une mise à jour. Si tel est le cas, cela signifie que pour chaque mise à jour simple, une validation XML complexe sera effectuée inutilement.

Est-ce que je comprends bien et si oui, comment puis-je contourner ce manque d'insertions / mises à jour via un proc stocké?

Oui, tout d'abord, les triggersurs se triggersront pour l'opération EVERY INSERT ou UPDATE – vous ne pouvez pas limiter cela à un seul triggersment lorsque certaines colonnes seront affectées. Vous pouvez vérifier dans le triggersur pour voir si certaines colonnes ont été affectées et prendre des décisions en fonction de cela – mais vous ne pouvez pas empêcher le triggersment du triggersur en premier lieu.

Et deuxièmement, oui, lorsque le triggersur se triggers, vous aurez TOUTES les colonnes de la table sous-jacente dans les pseudo tables INSERTED et / ou DELETED.

Une façon de changer cela est de déplacer la grande colonne XML dans une table séparée et de mettre ce gros triggersur de validation XML lourd uniquement sur cette table. Dans ce cas, si vous mettez à jour ou insérez dans la table de base uniquement, vous obtiendrez less de données, less de logique de validation. Ce n'est que lorsque vous insérez ou mettez à jour dans la table XML, vous obtiendrez la grande validation en cours.