Comment faire pour tester plusieurs lignes d'actions dans un Serveur SQL server déclencheur?
Ma maternelle SQL Server m'a appris qu'un déclencheur peut être tiré avec plusieurs lignes dans la inserted et deleted pseudo tables. J'ai surtout écris mon code de déclencheur avec cela à l'esprit, ce qui entraîne souvent dans certains curseur selon cludge. Maintenant, je suis vraiment ne pouvoir les tester de tir pour une seule ligne à la fois. Comment puis-je générer un multirow déclencheur et SQL Server en fait jamais envoyer un multirow déclencheur? Puis-je définir un indicateur de sorte que SQL Server ne feu seule ligne déclencheurs??
OriginalL'auteur Tom | 2009-01-02
Vous devez vous connecter pour publier un commentaire.
Oui, si une instruction affecte plus d'une ligne, il doit être manipulé par un seul déclencheur d'appel, comme vous pouvez vous en voulez revenir l'ensemble de la transaction. Il n'est pas possible de diviser à se séparer de déclenchement des appels de la logique et je ne pense pas que SQL Server fournit un tel drapeau. Vous pouvez faire de SQL Server appel de votre détente avec plusieurs rangées par l'émission d'une instruction UPDATE ou DELETE sur plusieurs lignes.
Dave, absolument. Je voulais juste préciser pourquoi une telle chose ne devrait logiquement être possible. Le déclencheur doit avoir des connaissances sur l'ensemble de la situation "à la fois" ce qui ne sera pas possible si il a couru pour chaque ligne. Également SUPPRIMER MyTable déclaration ai pris beaucoup plus de temps si le déclencheur est cher
Markle: tout à fait d'accord. Vote de votre commentaire si je le pouvais!
OriginalL'auteur Mehrdad Afshari
Déclencher les définitions devraient toujours gérer plusieurs lignes.
Prises de SQLTeam:
Au-dessus de la gâchette ne fonctionne que pour la dernière ligne dans la table inserted.
C'est la façon dont vous devriez la mettre en œuvre:
SET SomeColumn = t1.SomeColumn
semble être faux, où est l'aliast1
défini? Néanmoins, +1 parce que maintenant je comprends pourquoi mon déclencheur a été seulement mis le feu pour la dernière ligne insérée.désolé, c'était une faute de frappe. Mis à jour.
OriginalL'auteur Mitch Wheat
D'abord c'est moi qui vous le font les déclencheurs de gérer plusieurs lignes à l'aide d'un curseur. Ne le faites pas! L'utilisation d'un ensemble à base de tresorerie au lieu jioining à la insérées ou supprimées pseudotables. Quelqu'un a mis un de ces curseur selon triggerson notre base de données avant que je suis venu travailler ici. Il a fallu plus de quarante minutes pour traiter une 400,00 d'insertion d'enregistrements (et j'ai souvent à faire des inserts de plus de 100 000 enregistrements de cette table pour un client). Modification à une solution à base changé le temps de moins d'une minute. Alors que tous les déclencheurs doivent être capable de gérer plusieurs lignes, vous ne devez pas le faire par la création d'un spectacle de cauchemar.
Si vous pouvez écrire un select pour le cusor, vous pouvez écrire une instruction insert, update ou delete, basé sur la même commande select qui est à base de jeu.
Vous pouvez écrire une procédure stockée qui utilise une variable de table comme une variable d'entrée et effectue base de travail. En aucun cas, utiliser un curseur dans un déclencheur.
De plus, le rendement est beaucoup plus critique que la facilité de maintenance. La facilité de maintenance ne doit jamais entraver les performances.
OriginalL'auteur HLGEM
J'ai toujours écrit mes déclencheurs pour gérer plusieurs lignes, c'est ma compréhension que si une seule requête d'insertion/mise à jour/supprimé plusieurs lignes alors qu'un seul déclencheur aurait le feu et en tant que tel, vous devez utiliser un curseur pour vous déplacer dans les enregistrements un par un.
OriginalL'auteur Steven Robbins
Une instruction SQL appelle toujours un déclencheur d'exécution - qui fait partie de la définition d'un déclencheur. (C'est aussi une circonstance qui semble, au moins une fois le voyage jusqu'à tout le monde qui écrit un déclencheur.) Je crois que vous pouvez découvrir combien de dossiers sont affectés par l'inspection @@ROWCOUNT.
OriginalL'auteur dkretz