Si tiene una función/proceso almacenado que se llama con frecuencia de un sitio web, por ejemplo, puede causar problemas.
El proceso almacenado se eliminará durante unos milisegundos/segundos, y durante ese tiempo, todas las consultas fallarán.
Si realiza una modificación, no tiene este problema.
Las plantillas para el procedimiento almacenado recién creado son por lo general esta forma:
IF EXISTS (SELECT * FROM sysobjects WHERE type = 'P' AND name = '<name>')
BEGIN
DROP PROCEDURE <name>
END
GO
CREATE PROCEDURE <name>
......
Sin embargo, lo contrario es mejor, la OMI:
Si no existe la storedproc/función/etc, lo crea con una declaración de selección ficticia. Entonces, el alter siempre funcionará, nunca se descartará.
Tenemos un procedimiento almacenado para eso, por lo que nuestros procedimientos almacenados/funciones generalmente como esto:
EXEC Utils.pAssureExistance 'Schema.pStoredProc'
GO
ALTER PROCECURE Schema.pStoredProc
...
y utilizamos el mismo procedimiento almacenado para funciones:
EXEC Utils.pAssureExistance 'Schema.fFunction'
GO
ALTER FUNCTION Schema.fFunction
...
En Utils.pAssureExistance hacemos una IF y vemos el primer caracter después del ".": si es una "f", creamos una función ficticia, si es "p", creamos un proceso almacenado ficticio.
Tenga cuidado, si crea una función escalar ficticia, y su ALTER está en una función con valores de tabla, ALTER FUNCTION fallará, diciendo que no es compatible.
Una vez más, Utils.pAssureExistance puede ser práctico, con un parámetro opcional adicional
EXEC Utils.pAssureExistance 'Schema.fFunction', 'TableValuedFunction'
creará una función con valores de tabla ficticia,
Adicionalmente, puede que me equivoque, pero creo que si hacer un procedimiento de caída y una consulta actualmente está utilizando el proceso almacenado, fallará.
Sin embargo, un procedimiento alternativo esperará a que todas las consultas dejen de usar el proceso almacenado y luego lo modifique. Si las consultas "bloquean" el proceso almacenado durante demasiado tiempo (digamos un par de segundos), el ALTER dejará de esperar el bloqueo y alterará el proceso almacenado de todos modos: las consultas que usan el proceso almacenado probablemente fallarán en ese punto.
Seguimiento pregunta: ¿es DROP ... CREAR todavía atómica? Asumo que ALTER es atómico ya que es una declaración única, pero vale la pena verificar esto también. – gzak