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

Kha*_*uez 19 sql-server stored-procedures acid sql-server-2005

我有一个小的,一行更改(修改字符串中的拼写错误),我想尽快部署到我们的生产SQL Server 2005服务器的存储过程.

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

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

考虑到SQL Server的ACID性质,我希望它是安全的.它在同一时间运行的可能性,特别是因为SP非常小,非常低,但我更愿意确定,而且我也对答案感兴趣,仅用于教育目的.

可以说,ServerFault会是一个更好的地方,对不起,如果错误的话.

谢谢.

Ext*_*Use 21

对过程使用ALTER时,将设置架构修改锁.SP仍然存在,但客户端必须等到ALTER执行.这同样适用于ALTER,它会等到客户端不使用SP.


小智 17

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

我开始时:

CREATE PROCEDURE dbo.Stupid
AS
WAITFOR DELAY '0:00:10'
SELECT TOP 5 * FROM dbo.UniqueId
GO
Run Code Online (Sandbox Code Playgroud)

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

EXEC dbo.Stupid
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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

EXEC dbo.Stupid
Run Code Online (Sandbox Code Playgroud)

结果:

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

怎么了:

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