2010-11-28 11 views
1

Dans SQL Server 2008, j'ai un scénario dans lequel j'ai une table avec une validation complexe lors de l'insertion/mise à jour. Cela inclut la nécessité de convertir une entrée XML dans une table afin de valider ses données par rapport à une table permanente.Comportement des déclencheurs "AFTER INSERT, UPDATE" dans SQL Server

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 here, 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 cela correctement et si oui, comment puis-je contourner ce manque d'insertions/mises à jour via un proc stocké?

Répondre

3

Oui, tout d'abord, les déclencheurs se déclencheront pour EVERY opération INSERT ou UPDATE - vous ne pouvez pas limiter cela au déclenchement seulement lorsque certaines colonnes seront affectées. Vous pouvez vérifier dans le déclencheur 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 déclenchement du déclencheur en premier lieu. Et deuxièmement, oui, lorsque le déclencheur se déclenche, vous aurez TOUTES les colonnes de la table sous-jacente dans les tables pseudo INSÉRÉES et/ou SUPPRIMÉES. L'une des façons de modifier cela est de déplacer la grande colonne XML dans une table distincte et de mettre ce gros déclencheur 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 moins de données, moins 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.

+2

Je viens de réaliser pourquoi je n'ai jamais utilisé de triggers et toujours utilisé des procédures stockées pour insérer/mettre à jour/supprimer. Il est tellement plus facile de dire "si @xml n'est pas null begin (valider) (update) end". – IamIC

+0

@IanC: les déclencheurs ont leur raison d'être - mais ils ne sont pas la solution pour tout. Un proc stocké vous donne plus de contrôle - définitivement. –

+0

Les déclencheurs sont horribles, horribles abominations des couches les plus profondes de l'enfer et devraient être évités comme la peste. Ils ont tendance à produire très difficile à trouver/corriger/corriger les bogues. –

Questions connexes