2 votes

Splitting Trigger in SQL Server

Salutation, Récemment, j'ai commencé à travailler sur une application, où 8 modules différents utilisent la même table à un moment donné dans le flux de travail. Cette table a un trigger Instead-Of, qui fait 5000 lignes (où les 500 premières et 500 dernières lignes sont communes à tous les modules, et ensuite chaque module a ses propres 500 lignes de code). Comme le nombre de modules va augmenter et que je veux garder les choses aussi claires (et séparées) que possible, je me demandais s'il y avait une sorte de meilleure pratique pour diviser le déclencheur en procédures stockées, ou si je devais tout laisser en un seul endroit ? P.S. Y aura-t-il des pénalités de performance pour appeler des procédures à partir du déclencheur et leur passer plus de 15 paramètres ?

3voto

Damien_The_Unbeliever Points 102139

Gardant à l'esprit que le inserted y deleted les pseudo-tables ne sont accessibles qu'à l'intérieur du code déclencheur, et qu'elles peuvent contenir multiple les rangs, vous êtes face à deux choix :

  • Traiter les lignes dans inserted y deleted dans un RBAR 1 de façon à pouvoir passer des paramètres scalaires aux procédures stockées, ou,

  • Copiez toutes les données de inserted y deleted dans des variables de table qui sont ensuite transmises aux procédures comme il convient.

Je m'attendrais à ce que l'une ou l'autre approche impose 2 une surcharge de performance, juste à cause de la copie

Cela dit, il semble que trop de choses se passent à l'intérieur des déclencheurs eux-mêmes - tout ce code doit-il faire partie de la même transaction qui a exécuté l'instruction DML ? Si ce n'est pas le cas, envisagez d'utiliser une forme de file d'attente (une table de requêtes ou Service Broker, par exemple) dans laquelle vous placerez les informations sur le travail à effectuer, puis traiterez les données ultérieurement. Si vous utilisez Service Broker, vous pourriez lui demander d'inspecter un message partagé puis d'envoyer les messages appropriés à des points de terminaison dédiés pour chacun de vos modules, le cas échéant.

1 Row By Agonizing Row - en utilisant soit un cursor de quelque chose d'autre pour simuler l'accès à chaque ligne tour à tour - ce qui est généralement mal vu dans un langage basé sur les ensembles comme SQL.

2 Il est impossible de savoir dans quelle mesure sans entrer dans les détails de votre code, sans essayer toutes les approches possibles et sans mesurer le résultat.

1voto

Je ne pense pas qu'il y ait une pénalité de performance significative dans ce cas.

De toute façon, c'est une mauvaise pratique de tout écrire dans le trigger (quand il fait 5000 lignes...). Je pense que la principale considération est la maintenabilité, qui sera bien meilleure si vous la divisez vers plusieurs SPs

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X