2013-02-21 3 views
15

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

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

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

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

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

спасибо.

+6

Когда вы выполняете ** хранимую процедуру, она загружается в память, анализируется, определяется план запроса, а затем выполняется. Поэтому после того, как он был загружен на первом этапе - вы можете полностью его изменить, это не повлияет на ваше выполнение. –

ответ

16

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

+0

Большое спасибо. –

10

Я только что проверил это в SQL Server 2008 R2

Я начал с:

CREATE PROCEDURE dbo.Stupid 
AS 
WAITFOR DELAY '0:00:10' 
SELECT TOP 5 * FROM dbo.UniqueId 
GO 

Я тогда сделал следующий SQL Server Query Window 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 окно 3, в то время как запросы в Query Window 1 и запросов Окно 2 были запущены:

EXEC dbo.Stupid 

Результаты:

  • Query Window 1 вбежал 10 секунд (и, следовательно, закончено после окон 2 и 3) и возвращенных идентификаторов 1 - 5
  • запросов Окно 2 изменен и запустил процедуру в течение 5 секунд, и возвращается IDS 6 - 10
  • Запрос Окно 3 побежал в течение 5 секунд и возвращается IDS 6 - 10

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

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

Хорошее исследование !! –

Смежные вопросы