Ai-je besoin d'un «temps d'arrêt» pour mettre à jour une procédure stockée? (En raison d'une erreur de «définition modifiée»)

8

J'ai toujours pensé que la mise à jour d'une procédure stockée était quelque chose que je pouvais faire pendant que les utilisateurs utilisaient activement le système.

Mais je teste actuellement une mise à jour d'une procédure stockée et pendant qu'un long appel au sproc était en cours d'exécution (il y avait 4+ minutes dans l'appel), j'ai mis à jour le sproc. (J'avais l'intention d'essayer un autre plan de requête dans une fenêtre séparée.)

Quand je suis retourné à la longue course, j'ai eu cette erreur:

The definition of object 'MySprocName' has changed since it was compiled.

Cette erreur semble indiquer que tout sproc qui est activement exécuté échouera si la définition de ce sproc est mise à jour. (Je pensais qu'une fois qu'un sproc commencerait à fonctionner, il utiliserait ce plan pour le reste de la course malgré les modifications apportées à la définition.)

Est-ce vrai? Dois-je avoir des temps d'arrêt pour mettre à jour la définition d'un sproc?

Vaccano
la source
3
L'appel de procédure stockée fait-il partie d'une transaction plus importante? At-il un code qui supprime les verrous de schéma sur quoi que ce soit? En théorie, l'alter devrait juste être bloqué. Pouvez-vous entrer plus en détail sur ce que fait la procédure et en quoi elle fait partie?
Aaron Bertrand
@aaron Bertrand - c'est un sproc assez bénin. Il a certains appels sélectionnés. Pas de serrures ou d'autres choses comme ça. La seule chose importante est qu'il a des instructions «si» basées sur les paramètres. L'exécution réelle de la requête varie un peu en fonction des paramètres. Il est appelé à partir d'un service .net.
Vaccano
2
Une procédure «assez bénigne» ne devrait pas prendre quatre minutes. Que fait-il pendant tout ce temps?
Aaron Bertrand
Avez-vous essayé alter proc <proc name> WITH RECOMPILE? Il s'agit d'une option au niveau de la procédure pour définir la procédure à recompiler après chaque exécution. Cela signifie que le plan sera toujours recompilé et évitera ainsi la réutilisation des plans mis en cache.
MarmiK
dba.stackexchange.com/questions/154939/… Avez-vous regardé cette question?
k010mb0

Réponses:

1

Oui, il est vrai que vous ne devez pas modifier une procédure stockée en cours d'exécution, car SQL Server ne l'aime pas.

En ce qui concerne les temps d'arrêt, eh bien, vous ne devriez pas apporter de modifications aux procédures stockées fréquemment utilisées dans un environnement de production occupé pendant les heures de fonctionnement comme meilleure pratique.

Randolph West
la source