Question

J'ai une table qui comporte un déclencheur d'insertion. Si j'insère dans 6000 enregistrements de cette table dans une instruction insert d'une procédure stockée, cette procédure stockée sera-t-elle renvoyée avant la fin du déclencheur d'insertion?

Juste pour être sûr de penser correctement, le déclencheur ne devrait être appelé (je sais que "appelé" n'est pas le mot juste) une fois, car il n'y avait qu'une seule instruction d'insertion, n'est-ce pas?

Ma question principale est la suivante: le sproc se terminera-t-il même si le déclencheur n'est pas terminé?

Était-ce utile?

La solution

Votre déclencheur d’insertion s’exécutera une fois pour toute la déclaration d’insertion. C’est pourquoi il est important d’utiliser la table temporaire insérée pour voir ce qui a été réellement inséré, et pas seulement de sélectionner l’enregistrement individuel le plus récent, ou quelque chose du genre.

Je viens de tester un déclencheur d'insertion et de mise à jour et, en fait, ils sont considérés comme faisant partie de l'insertion par le serveur SQL. le processus ne sera pas terminé avant la fin du déclenchement.

Autres conseils

Les déclencheurs font partie de la transaction qui les a appelés.

Une chose importante à savoir sur les déclencheurs est que le déclencheur est déclenché une fois pour chaque transaction (au moins sur le serveur SQL, vous devez vérifier les autres dbs, mais même s'il traite les lignes successives, il s'agit généralement d'une mauvaise idée), donc si vous insérez 6000 enregistrements, le déclencheur se déclenche une fois et non pas 6000 fois. Beaucoup de gens ne sont pas conscients de cela et écrivent des déclencheurs comme s'ils traiteraient plusieurs insertions d'enregistrement, enregistrement par enregistrement. Ce n'est pas vrai et votre déclencheur doit prendre en compte le traitement de l'insertion de plusieurs enregistrements.

L'appel du déclencheur n'est pas asynchrone. Chaque appel à votre procédure d’insertion aura pour effet de déclencher le déclencheur et cette procédure ne sera renvoyée que lorsque le déclencheur sera terminé.

Examinez le plan de requête pour voir comment cela fonctionne. Vous verrez que les instructions du déclencheur seront appelées à chaque appel de la procédure.

Le fait est que chaque fois que les critères TRIGGER sont remplis, le déclencheur se déclenche. Il se déclenche une fois en traitement par lots ou en transaction. Voir mon leçon 101 sur TRIGGER

Vous devez utiliser le curseur dans l'instruction insert pour traiter la ligne du déclencheur. Les déclencheurs de SQL Server étant activés une fois par instruction et non par ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top