如果在运行时更改存储过程会发生啥?

Posted

技术标签:

【中文标题】如果在运行时更改存储过程会发生啥?【英文标题】:What happens if altering a stored procedure while it is running?如果在运行时更改存储过程会发生什么? 【发布时间】:2013-02-06 16:57:04 【问题描述】:

我对一个存储过程进行了细微的一行更改(修正了字符串中的错字),我想尽快将其部署到我们的生产 SQL Server 2005 服务器。

我担心的是,如果在确切的时间运行 alter 语句来更新我的存储过程,会发生什么同时调用该存储过程?

它是否与存储过程的先前副本一起运行,还是会导致某些损坏或错误?

考虑到 SQL Server 的 ACID 特性,我希望它是安全的。 它同时运行的机会,特别是因为 SP 非常小,所以非常低,但我只是更愿意确定,而且我也对答案感兴趣,只是出于教育目的。

可以说,ServerFault 会是一个更好的地方,如果发错了,很抱歉。

谢谢。

【问题讨论】:

当你执行一个存储过程时,它被加载到内存中,被分析,一个查询计划被确定然后被执行。因此,在第一步加载后 - 您可以完全更改它,这不会对您的运行执行产生任何影响。 【参考方案1】:

我刚刚在 SQL Server 2008 R2 中对此进行了测试

我开始:

CREATE PROCEDURE dbo.Stupid
AS
WAITFOR DELAY '0:00:10'
SELECT TOP 5 * FROM dbo.UniqueId
GO

然后我做了以下 SQL Server 查询窗口 1:

EXEC dbo.Stupid

SQL Server 查询窗口 2,而查询窗口 1 中的查询正在运行:

ALTER PROCEDURE dbo.Stupid
AS
WAITFOR DELAY '0:00:05'
SELECT TOP 5 * FROM dbo.UniqueId
WHERE ID > 5
GO

EXEC dbo.Stupid

SQL Server 查询窗口 3,而查询窗口 1 和查询窗口 2 中的查询正在运行:

EXEC dbo.Stupid

结果:

查询窗口 1 运行了 10 秒(因此在窗口 2 和 3 之后完成),并返回 ids 1 - 5 查询窗口 2 更改并在 5 秒内运行该过程,并返回 ids 6 - 10 查询窗口 3 在 5 秒内运行并返回 ids 6 - 10

会发生什么:

已经执行的代码将在过程上完成运行,就像它们启动时一样 在代码更改后开始运行的任何内容都将运行新代码

【讨论】:

很好的研究!!【参考方案2】:

当对过程使用 ALTER 时,会设置模式修改锁。 SP 仍然存在,但客户端必须等到执行 ALTER。 这同样适用于 ALTER,它会一直等到客户端不使用 SP。

【讨论】:

以上是关于如果在运行时更改存储过程会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章

在运行后台进程时更改分支会发生啥?

存储过程在第一次运行时运行缓慢

由于两次会话同时访问相同的存储过程,因此发生了事务(进程ID)死锁

如果存储过程啥都不执行,那么 ORA 代码会是啥?

在存储过程中写SET XACT_ABORT ON 有什么用,不写会发生什么问题

数据库存储过程和视图一般啥时候用