Pourquoi l'exécution de ALTER TABLE sur une colonne la ferait-elle passer de NOT NULL à NULL?

8

Je mets à jour en masse une base de données SQL Server. Je modifie toutes nos numeric(38,0)colonnes en int (oui, les scripts SQL Server ont été créés à partir de scripts Oracle) . En utilisant SMO et C # (je suis un ingénieur sw) , j'ai réussi à générer de très beaux scripts comme le ferait SQL Server Management Studio . Tout fonctionne très bien, sauf pour un problème particulier:

pour une poignée de tables, lorsque j'appelle, ALTER TABLE [myTable] ALTER COLUMN [columnA] INTil décide de changer également la colonne NOT NULL to NULL. C'est bien sûr un énorme problème car j'ai besoin de régénérer les clés primaires pour la plupart de ces tables sur ces colonnes particulières.

Évidemment, j'ai beaucoup d'options à l'aide de SMO pour savoir quelles colonnes sont des clés primaires et les forcer à ne PAS être NULL après ou pendant la mise à jour du type de données, mais je suis vraiment curieux de savoir ce qui peut provoquer cela.

Eric Liprandi
la source
Vous pouvez le savoir si les colonnes sont également membres de la clé primaire via T / SQL. SMO n'est pas requis.
mrdenny

Réponses:

10

Cela dépend de votre réglage de SET ANSI_NULL_DFLT_OFF ou SET ANSI_NULL_DFLT_ON (lisez-les pour d'autres effets aussi de SET ANSI_DEFAULTS).

Personnellement, j'aurais spécifié cette contrainte explicitement si je voulais des colonnes nulles ou non nulles plutôt que de compter sur les paramètres d'environnement.

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

Vous pouvez à nouveau exécuter cette commande et si une colonne est déjà à la valeur nulle souhaitée, la commande est ignorée.

Cependant, vous avez également déclaré que vous ne devez le modifier que lorsqu'il fait partie d'une clé primaire. Cela ne devrait pas avoir d'incidence sur le fait qu'une colonne peut être annulable ou non à partir de la phase de modélisation / mise en œuvre

gbn
la source