Estoy actualizando en masa una base de datos de SQL Server. Estoy cambiando todas nuestras numeric(38,0)
columnas a int
(sí, los scripts de SQL Server se crearon a partir de scripts de Oracle) . Usando SMO y C # (soy un ingeniero sw) , logré generar scripts realmente agradables como lo haría el estudio SQL Server Management . Todo funciona muy bien, excepto por un problema en particular:
para un puñado de tablas, cuando lo llamo ALTER TABLE [myTable] ALTER COLUMN [columnA] INT
decide también cambiar la columna de NOT NULL to NULL
. Eso, por supuesto, es un gran problema, ya que necesito regenerar claves primarias para la mayoría de esas tablas en esas columnas particulares.
Obviamente, tengo muchas opciones usando SMO para descubrir qué columnas son claves principales y forzarlas a NO ser NULAS después o mientras estoy actualizando el tipo de datos, pero tengo mucha curiosidad sobre qué puede estar causando esto.
fuente
Respuestas:
Depende de su configuración de SET ANSI_NULL_DFLT_OFF o SET ANSI_NULL_DFLT_ON (lea estos para otros efectos también de SET ANSI_DEFAULTS).
Personalmente, habría especificado esta restricción explícitamente si quisiera columnas nulas o no nulas en lugar de confiar en la configuración del entorno.
Puede emitir este comando nuevamente y si una columna ya tiene la nulabilidad deseada, el comando se ignora.
Sin embargo, también dijo que solo necesita cambiarlo donde es parte de una clave primaria. Eso no debería influir en si una columna puede ser anulada o no desde la fase de modelado / implementación
fuente
SET ANSI_NULL_DFLT_ON
No aplica aquí. Los valores predeterminados ANSI_NULL siempre están activados para ALTER COLUMN; si no se especifica, la columna es anulable.