Como parte de nuestro proceso de compilación, ejecutamos un script de actualización de la base de datos mientras implementamos el código en 4 entornos diferentes. Además, puesto que la misma consulta se agregarán hasta que caigamos en un comunicado de producción que tiene que ser capaz de ejecutar varias veces en una base de datos dada. Me gusta esto:
IF NOT EXISTS (SELECT * FROM sys.tables WHERE object_id = OBJECT_ID(N'[Table]'))
BEGIN
CREATE TABLE [Table]
(...)
END
Actualmente tengo una declaración de esquema de creación en el script de implementación / compilación. ¿Dónde consulto la existencia de un esquema?
sql-server-2005
schema
Pulsehead
fuente
fuente
Respuestas:
¿Está buscando sys.schemas ?
Tenga en cuenta que
CREATE SCHEMA
debe ejecutarse en su propio lote (según la respuesta a continuación )fuente
SELECT 1/0...
@bdukes tiene razón en el dinero para determinar si el esquema existe, pero la declaración anterior no funcionará en SQL Server 2005.
CREATE SCHEMA <name>
necesita ejecutarse en su propio lote. Una solución es ejecutar laCREATE SCHEMA
declaración en un ejecutivo.Esto es lo que usé en mis scripts de compilación:
fuente
Esto es antiguo, así que me siento obligado a agregar: Para SQL SERVER 2008+ Todo esto funciona (para la parte seleccionada), luego utilícelo
EXECUTE('CREATE SCHEMA <name>')
para crearlo con resultados negativos.fuente
IF schema_id ('MySchemaName') IS NULL
funciona bien y parece un poco más conveniente que la respuesta aceptada.Solo para ser más "defensivo", la siguiente versión genera un error de conversión de tipo para tener en cuenta la posibilidad (aunque improbable) de> 1 coincidencia
Schema
similar a cómo el código de validación a menudo arroja intencionalmente excepciones porque creo que es bueno y creo que es "mejores prácticas" para tener en cuenta todos los posibles resultados devueltos, por poco probables que sean, e incluso si es solo para generar una excepción fatal porque los efectos conocidos de detener el procesamiento suelen ser mejores que los efectos en cascada desconocidos de los errores no atrapados. Debido a que es muy poco probable, no pensé que valiera la pena la molestia de unaCount
verificación separada +Throw
oTry
-Catch
-Throw
para generar un error fatal más fácil de usar, pero aún así un error fatal.SS 2005-:
SS 2008+:
Luego:
fuente
Throw
Exception
. Como usted ha dicho, no es " 'probable'" a suceder, por lo que en mi humilde opinión, no valía la pena en su conjuntoTry
-Catch
o separadaCount
de verificación para generar un error fatal más fácil de usar, pero independientemente, yo probablemente querrá un error fatal. Creo y creo que es "la mejor práctica" tener en cuenta todos los posibles resultados devueltos, por poco probables que sean, e incluso si es solo para generar una excepción fatal porque los efectos conocidos de detener el procesamiento suelen ser mejores que los efectos en cascada desconocidos de no atrapado errores.Select
,Insert
,Update
oDelete
sentencia ha devuelto / afectó a más o menos que el # de filas esperado por improbable. Incluso si hay (hay)Unique
Index
actualmente asegurando que el # esperado (es decir, 1) de Filas sean devueltas / afectadas, eso podría cambiar (accidentalmente o (miope) "'intencionalmente'") en el futuro.Si el diseño de los componentes lo permite, esto también funciona.
fuente