Если у вас есть функция / хранимый процесс, который, например, очень часто вызывается с веб-сайта, это может вызвать проблемы.
Сохраненный процесс будет отброшен на несколько миллисекунд / секунд, и в течение этого времени все запросы не будут выполнены.
Если вы делаете изменения, у вас нет этой проблемы.
Шаблоны для вновь созданного хранимого процесса обычно имеют такую форму:
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = '<name>')
BEGIN
DROP PROCEDURE <name>
END
GO
CREATE PROCEDURE <name>
......
Однако лучше наоборот, imo:
Если сохраненный процесс / функция / и т. Д. Не существует, создайте его с помощью фиктивного оператора выбора. Тогда alter всегда будет работать - он никогда не будет сброшен.
Для этого у нас есть сохраненный процесс, поэтому наши хранимые процедуры / функции обычно выглядят так:
EXEC Utils.pAssureExistance 'Schema.pStoredProc'
GO
ALTER PROCECURE Schema.pStoredProc
...
и мы используем тот же хранимый процесс для функций:
EXEC Utils.pAssureExistance 'Schema.fFunction'
GO
ALTER FUNCTION Schema.fFunction
...
В Utils.pAssureExistance мы делаем IF и смотрим на первый символ после «.»: Если это «f», мы создаем фиктивную функцию, если это «p», мы создаем фиктивный хранимый процесс.
Будьте осторожны, если вы создаете фиктивную скалярную функцию и ваш ALTER использует табличную функцию, функция ALTER FUNCTION завершится ошибкой, сказав, что она не совместима.
Опять же, Utils.pAssureExistance может быть полезен с дополнительным необязательным параметром
EXEC Utils.pAssureExistance 'Schema.fFunction', 'TableValuedFunction'
создаст фиктивную табличную функцию,
Кроме того, я могу ошибаться, но я думаю, что если вы выполните процедуру удаления и запрос в данный момент использует сохраненный процесс, он не будет выполнен.
Однако процедура alter будет ждать, пока все запросы прекратят использовать сохраненный процесс, и затем изменит его. Если запросы «блокируют» хранимый процесс слишком долго (скажем, пару секунд), ALTER перестанет ожидать блокировки и в любом случае изменит сохраненный процесс: в этот момент запросы, использующие хранимый процесс, вероятно, потерпят неудачу.