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

时间:2013-02-21 11:25:14

标签: sql-server sql-server-2005 stored-procedures acid

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

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

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

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

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

谢谢。

2 个答案:

答案 0 :(得分:18)

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

答案 1 :(得分:14)

我刚刚在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秒内运行(因此在Windows 2和3之后完成),并返回ids 1 - 5
  • 更改了查询窗口2并在5秒内运行了该过程,并返回了ID 6-10
  • 查询窗口3在5秒内运行并返回ID 6 - 10

会发生什么:

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