我是否需要“停机时间”来更新存储过程?(由于“定义更改”错误)


8

我一直以为更新存储过程是我在用户积极使用系统时可以做的事情。

但是我目前正在测试存储过程的更新,并且正在执行对sproc的长时间运行的调用(调用时已超过4分钟),因此我更新了sproc。(我打算在单独的窗口中尝试其他查询计划。)

当我回到长期运行的机器时,出现了以下错误:

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

该错误似乎表明,如果更新了该存储过程的定义,则任何正在执行的存储过程都会失败。(我认为,一旦存储程序开始运行,尽管定义有所更改,它将在其余的运行中使用该计划。)

这是真的?我是否需要停机才能更新存储过程的定义?


3
存储过程调用是更大事务的一部分吗?是否有任何代码可以删除任何模式锁?从理论上讲,变更应该被阻止。您能否详细介绍该程序的功能以及它的组成部分?
亚伦·伯特兰

@aaron Bertrand-这是一个相当不错的程序。它有一些精选的热门来电。没有锁或其他类似的东西。唯一有意义的是它具有一些基于参数的“ if”语句。实际查询运行会根据参数有所不同。它是从.net服务调用的。
瓦卡诺

2
“相当良性”的过程应该不需要四分钟的时间。那段时间一直在做什么?
亚伦·伯特兰

您是否尝试过alter proc <proc Name> WITH RECOMPILE?这是一个过程级别的选项,用于将过程设置为在每次运行后重新编译。这意味着该计划将始终重新编译,因此避免了重用缓存的计划。
MarmiK

Answers:


1

是的,您确实不应该更改正在运行的存储过程,因为SQL Server不喜欢它。

关于减少停机时间,是的,您最好不要在工作时间内在繁忙的生产环境中对经常使用的存储过程进行更改。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.