¿Necesito un "tiempo de inactividad" para actualizar un procedimiento almacenado? (Debido al error de "definición cambiada")

8

Siempre pensé que actualizar un procedimiento almacenado era algo que podía hacer mientras los usuarios usaban activamente el sistema.

Pero actualmente estoy probando una actualización de un procedimiento almacenado y mientras se ejecutaba una llamada de larga ejecución al sproc (faltaban más de 4 minutos para la llamada), actualicé el sproc. (Estaba planeando probar un plan de consulta diferente en una ventana separada).

Cuando volví a la larga, tuve este error:

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

Este error parece indicar que cualquier sproc que se esté ejecutando activamente fallará si se actualiza la definición de ese sproc. (Pensé que una vez que un sproc comenzara a funcionar, usaría ese plan para el resto de la ejecución a pesar de los cambios en la definición).

¿Es esto cierto? ¿Necesito tener tiempos de inactividad para actualizar la definición de un sproc?

Vaccano
fuente
3
¿La llamada al procedimiento almacenado es parte de una transacción mayor? ¿Tiene algún código que elimine bloqueos de esquema en algo? En teoría, el alter debería estar bloqueado. ¿Puede entrar en más detalles sobre lo que hace el procedimiento y de qué forma parte?
Aaron Bertrand
@aaron Bertrand: es un procedimiento bastante benigno. Tiene algunas llamadas principales seleccionadas. Sin cerraduras ni otras cosas por el estilo. Lo único significativo es que tiene algunas declaraciones "if" basadas en los parámetros. La ejecución real de la consulta varía un poco según los parámetros. Se llama desde un servicio .net.
Vaccano
2
Un procedimiento "bastante benigno" no debería tomar cuatro minutos en ejecutarse. ¿Qué está haciendo todo ese tiempo?
Aaron Bertrand
¿Has probado alter proc <nombre de proceso> WITH RECOMPILE? Esta es una opción de nivel de procedimiento para configurar el procedimiento para que se vuelva a compilar después de cada ejecución. Esto significa que el plan siempre se recompilará y evitará que los planes en caché se reutilicen.
MarmiK
dba.stackexchange.com/questions/154939/… ¿Has mirado esta pregunta?
k010mb0

Respuestas:

1

Sí, es cierto que no debe cambiar un procedimiento almacenado en ejecución activa, porque a SQL Server no le gusta.

En cuanto a tomar el tiempo de inactividad, bueno, sí, no debería realizar cambios en los procedimientos almacenados de uso frecuente en un entorno de producción ocupado durante las horas de funcionamiento como una mejor práctica.

Randolph West
fuente