Desactivar la comprobación del esquema en función / creación de procedimiento almacenado


17

Estoy tratando de automatizar el proceso que ejecuta cambios en la base de datos SQL Server 2008 R2. El proceso que puse en el lugar cae y recrea mis procedimientos y funciones almacenados, así como también ejecuta scripts para cambiar las tablas / columnas / datos. Desafortunadamente, uno de los scripts requiere que una de las funciones se establezca primero. Pero no puedo ejecutar todos los cambios de proceso / función almacenados primero porque se basa en columnas que se agregan primero de las secuencias de comandos de cambio de tablas / columnas / datos.

Me preguntaba si era posible ejecutar procedimientos y funciones almacenados sin que SQL Server valide las columnas utilizadas en la definición de la función / SP. Traté de buscar pero no pude encontrar una condición o comando para habilitar esto.


Parece que solo necesita reorganizar la creación de objetos en sus scripts.
Thomas Stringer

@shark Es que un script de cambio requiere una dependencia de una función que esté allí, lo que no era en ese momento ... para hacer eso requeriría una intervención manual; Quería algo más automático.
Brian Mains

Respuestas:


20

Puede crear procedimientos almacenados que hagan referencia a objetos que aún no existen (por ejemplo, tablas y funciones). No puede crear procedimientos almacenados que hagan referencia a columnas que aún no existen en objetos que ya existen. Esta es la espada de doble filo de la resolución de nombres diferidos: SQL Server le brinda el beneficio de la duda en algunos casos, pero no en todos. Vea las ideas de Erland para SET STRICT_CHECKS ON;obtener algunas ideas de los lugares donde funciona y los lugares que rompe:

http://www.sommarskog.se/strict_checks.html

(Y cómo le gustaría el polo opuesto de lo que está buscando: desea permitir que se compile cualquier cosa independientemente de su existencia, y él quiere que se verifique cada columna o tabla).

No hay una configuración como SET DEFERRED_NAME_RESOLUTION OFF;si se hubiera solicitado:

http://connect.microsoft.com/sql/127152

Y no hay configuración como IGNORE ALL_RESOLUTION;.


Puede solucionar esto de varias maneras, que incluyen:

(a) use SQL dinámico en los procedimientos almacenados afectados.

(b) construya un trozo CREATE PROCEDUREsin nada, luego ejecute el resto de su script, luego ejecute uno ALTER PROCEDUREque tenga el cuerpo real (en esencia, implemente el procedimiento en dos fases).

(c) haga que su herramienta de implementación sea más inteligente sobre el orden de las operaciones. Si los cambios en la tabla requieren la presencia de una función, guíe esos cambios en último lugar. Las herramientas de comparación de esquemas como SQL Compare de RedGate son bastante buenas para generar scripts para usted en el orden de dependencia adecuado. No mencionas qué herramienta estás usando, pero si no está haciendo esto ...

(d) Martin Smith tiene una solución interesante aquí , pero no he jugado con ella.


Wow, ese truco de Martin Smith es brillantemente inteligente. Me sentiría sucio usándolo ahora, pero a los 20 años lo habría hecho.
John Zabroski

1

Puede crear un procedimiento almacenado que elimine o cambie el nombre del objeto en cuestión primero y luego ejecute su procedimiento almacenado original como SQL dinámico. De esta manera, no tiene que volver a escribir el procedimiento almacenado real para usar SQL dinámico.

El siguiente código ejecuta un procedimiento almacenado que hace referencia a columnas que aún no existen (Expense_Super_Compare)

IF OBJECT_ID('Expense_Super_Compare_Results', 'U') IS NOT NULL
BEGIN
     EXEC('DROP TABLE Expense_Super_Compare_Results');
END

exec('exec dbo.Expense_Super_Compare');
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.