Warum würde das Ausführen von ALTER TABLE für eine Spalte dazu führen, dass sie von NOT NULL auf NULL wechselt?

8

Ich aktualisiere massenhaft eine SQL Server-Datenbank. Ich ändere alle unsere numeric(38,0)Spalten in int (ja, SQL Server-Skripte wurden aus Oracle-Skripten erstellt) . Mit SMO und C # (ich bin ein SW-Ingenieur) konnte ich wirklich nette Skripte generieren, wie es SQL Server Management Studio tun würde. Es funktioniert alles sehr gut, bis auf ein bestimmtes Problem:

Wenn ich eine Handvoll Tabellen aufrufe, ALTER TABLE [myTable] ALTER COLUMN [columnA] INTwird beschlossen, auch die Spalte von zu ändern NOT NULL to NULL. Das ist natürlich ein großes Problem, da ich Primärschlüssel für die meisten dieser Tabellen in diesen bestimmten Spalten neu generieren muss.

Natürlich habe ich mit SMO viele Optionen, um herauszufinden, welche Spalten Primärschlüssel sind, und um zu erzwingen, dass sie nach oder während der Aktualisierung des Datentyps NICHT NULL sind, aber ich bin wirklich gespannt, was dies verursachen kann.

Eric Liprandi
quelle
Sie können dies herausfinden, wenn Spalten auch über T / SQL Mitglieder des Primärschlüssels sind. SMO ist nicht erforderlich.
Mrdenny

Antworten:

10

Dies hängt von Ihrer Einstellung von SET ANSI_NULL_DFLT_OFF oder SET ANSI_NULL_DFLT_ON ab (lesen Sie diese auch für andere Effekte aus SET ANSI_DEFAULTS).

Persönlich hätte ich diese Einschränkung explizit angegeben, wenn ich Null- oder Nicht-Null-Spalten wollte, anstatt mich auf Umgebungseinstellungen zu verlassen.

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

Sie können diesen Befehl erneut ausgeben. Wenn eine Spalte bereits die gewünschte Nullfähigkeit aufweist, wird der Befehl ignoriert.

Sie haben jedoch auch gesagt, dass Sie es nur dort ändern müssen, wo es Teil eines Primärschlüssels ist. Dies sollte keinen Einfluss darauf haben, ob eine Spalte in der Modellierungs- / Implementierungsphase auf Null gesetzt werden kann oder nicht

gbn
quelle