Что произойдет, если изменить хранимую процедуру во время ее работы?
У меня есть незначительное, одно изменение строки (исправление опечатки в строке), в хранимую процедуру, которую я хотел бы как можно скорее развернуть на нашем производственном сервере 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
Что происходит:
- Уже исполняемый код завершит выполнение процедуры, как было, когда они были запущены.
- Все, что запускается после изменения кода, запустит новый код