Perché l'esecuzione di ALTER TABLE su una colonna fa sì che passi da NOT NULL a NULL?


8

Sto aggiornando in massa un database di SQL Server. Sto cambiando tutte le nostre numeric(38,0)colonne in int (sì, gli script di SQL Server sono stati creati da script Oracle) . Usando SMO e C # (sono un ingegnere sw) , sono riuscito a generare script davvero piacevoli come farebbe SQL Server Management Studio . Funziona tutto molto bene, tranne per un problema particolare:

per una manciata di tabelle, quando chiamo ALTER TABLE [myTable] ALTER COLUMN [columnA] INTdecide di cambiare anche la colonna da NOT NULL to NULL. Questo ovviamente è un grosso problema poiché ho bisogno di rigenerare le chiavi primarie per la maggior parte di quelle tabelle su quelle particolari colonne.

Ovviamente, ho molte opzioni usando SMO per scoprire quali colonne sono chiavi primarie e costringerle a NON essere NULL dopo o mentre sto aggiornando il tipo di dati, ma sono davvero curioso di sapere cosa può causare questo.


Puoi scoprirlo se anche le colonne sono membri della chiave primaria tramite T / SQL. SMO non è richiesto.
mrdenny,

Risposte:


10

Dipende dall'impostazione di SET ANSI_NULL_DFLT_OFF o SET ANSI_NULL_DFLT_ON (leggi anche questi per altri effetti da SET ANSI_DEFAULTS).

Personalmente, avrei specificato questo vincolo in modo esplicito se avessi voluto colonne null o non null piuttosto che fare affidamento sulle impostazioni dell'ambiente.

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

È possibile emettere nuovamente questo comando e se una colonna è già nella nullità desiderata, il comando viene ignorato.

Tuttavia, hai anche detto che devi solo cambiarlo dove fa parte di una chiave primaria. Ciò non dovrebbe influire sul fatto che una colonna possa essere nullable dalla fase di modellazione / implementazione


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.