我对要尽快部署到生产SQL Server 2005服务器的存储过程进行了细微的一行更改(将字符串中的错字固定)。
我担心的是,如果在正确的时间运行alter语句更新我的存储过程,同时又有人同时调用该存储过程,会发生什么?
它是否与存储过程的上一个副本一起运行,还是会导致某些损坏或错误?
考虑到SQL Server的ACID性质,我希望它是安全的。它恰好在同一时间运行的机会非常低,特别是因为SP非常小,但是我只是想确保这一点,并且我对答案也很感兴趣,仅出于教育目的。
可以争辩说,ServerFault可能是个更好的选择,如果张贴错误,对不起。
谢谢。
[对该过程使用ALTER时,将设置模式修改锁。SP仍然存在,但是客户端必须等待,直到执行ALTER。同样适用于ALTER,它将等待客户端未使用SP。
我刚刚在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
结果:
会发生什么:
我尝试了类似的操作(长时间运行的存储过程),并且存储过程运行出现错误,该错误表明sp自开始运行以来已被更改。