Что произойдет, если изменить хранимую процедуру во время ее работы?

У меня есть незначительное, одно изменение строки (исправление опечатки в строке), в хранимую процедуру, которую я хотел бы как можно скорее развернуть на нашем производственном сервере SQL Server 2005.

Я беспокоюсь о том, что произойдет, если в то же самое время запустите оператор alter, чтобы обновить мою хранимую процедуру, случается, что что-то вызывает эту хранимую процедуру одновременно?

Выполняется ли она с предыдущей копией хранимой процедуры или может привести к некоторому повреждению или ошибкам?

Учитывая ACID-характер SQL Server, я бы ожидал, что это безопасно. Шансы на то, что он работает в одно и то же время, особенно потому, что SP достаточно мал, крайне низки, но я просто предпочитаю быть уверенным, и я также заинтересован в ответе только для образовательных целей.

Возможно, ServerFault будет лучше для этого, извините, если он неверно принят.

Спасибо.

Ответы

Ответ 1

При использовании ALTER для этой процедуры устанавливается блокировка модификации схемы. SP все еще существует, но клиентам придется ждать, пока не будет выполнен ALTER. То же самое относится к ALTER, он будет ждать, пока SP не будет использоваться клиентами.

Ответ 2

Я только что протестировал это в 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 Query Window 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 Query Window 3, в то время как запросы в Query Window 1 и Query Window 2 выполнялись:

EXEC dbo.Stupid

Результаты:

  • Окно запросов 1 запустилось через 10 секунд (и, следовательно, закончилось после окон 2 и 3) и вернуло идентификаторы 1 - 5
  • Окно запроса 2 изменилось и запустило процедуру за 5 секунд и вернуло идентификаторы 6 - 10
  • Окно запросов 3 запустилось через 5 секунд и вернуло идентификаторы 6 - 10

Что происходит:

  • Уже исполняемый код завершит выполнение процедуры, как было, когда они были запущены.
  • Все, что запускается после изменения кода, запустит новый код