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] INT
il 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.
la source
Réponses:
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.
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
la source
SET ANSI_NULL_DFLT_ON
ne s'applique pas ici. Les valeurs par défaut ANSI_NULL sont toujours activées pour ALTER COLUMN; si non spécifié, la colonne est nullable.