Eu sempre pensei que atualizar um procedimento armazenado era algo que eu poderia fazer enquanto os usuários estavam usando o sistema ativamente.
No momento, estou testando uma atualização para um procedimento armazenado e, enquanto uma chamada de longa execução para o sproc estava sendo executada (havia mais de 4 minutos na chamada), atualizei o sproc. (Eu estava planejando tentar um plano de consulta diferente em uma janela separada.)
Quando voltei para a longa, tive este erro:
The definition of object 'MySprocName' has changed since it was compiled.
Esse erro parece indicar que qualquer sproc que está sendo executado ativamente falhará se a definição desse sproc for atualizada. (Eu pensei que, uma vez que um sproc começasse a correr, ele usaria esse plano pelo resto da corrida, apesar das alterações na definição.)
Isso é verdade? Preciso ter períodos de inatividade para atualizar a definição de um sproc?
WITH RECOMPILE
? Esta é uma opção no nível do procedimento para definir o procedimento para recompilar após cada execução. Isso significa que o plano sempre será recompilado e, portanto, evita que os planos em cache sejam reutilizados.Respostas:
Sim, é verdade que você não deve alterar um procedimento armazenado em execução ativa, porque o SQL Server não gosta.
Quanto ao tempo de inatividade, bem, sim, você não deve fazer alterações nos procedimentos armazenados usados com frequência em um ambiente de produção ocupado durante o horário de funcionamento como uma prática recomendada.
fonte