¿Por qué ejecutar ALTER TABLE en una columna hace que pase de NOT NULL a NULL?

8

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] INTdecide 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.

Eric Liprandi
fuente
Puede averiguar esto si las columnas son miembros de la clave primaria también a través de T / SQL. No se requiere SMO.
mrdenny

Respuestas:

10

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.

ALTER TABLE [myTable] ALTER COLUMN [columnA] INT NOT NULL

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

gbn
fuente