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?
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.Respuestas:
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.
fuente