如果在运行过 程中更改存储过程会怎样?

问题描述 投票:21回答:3

我对要尽快部署到生产SQL Server 2005服务器的存储过程进行了细微的一行更改(将字符串中的错字固定)。

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

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

考虑到SQL Server的ACID性质,我希望它是安全的。它恰好在同一时间运行的机会非常低,特别是因为SP非常小,但是我只是想确保这一点,并且我对答案也很感兴趣,仅出于教育目的。

可以争辩说,ServerFault可能是个更好的选择,如果张贴错误,对不起。

谢谢。

sql-server sql-server-2005 stored-procedures acid
3个回答
24
投票

[对该过程使用ALTER时,将设置模式修改锁。SP仍然存在,但是客户端必须等待,直到执行ALTER。同样适用于ALTER,它将等待客户端未使用SP。


21
投票

我刚刚在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之后完成,并返回ID 1-5)>
  • 查询窗口2更改并在5秒钟内运行了该过程,并返回ID 6-10
  • 查询窗口3在5秒钟内运行并返回ID 6-10
  • 会发生什么:

  • 已经执行的代码将像开始时一样在该过程上完成运行
  • 更改代码后开始运行的所有内容都将运行新代码

0
投票

我尝试了类似的操作(长时间运行的存储过程),并且存储过程运行出现错误,该错误表明sp自开始运行以来已被更改。

© www.soinside.com 2019 - 2024. All rights reserved.