Wie ändere ich eine Spalte von null auf nicht null, wenn ein Index von dieser Spalte abhängt, ohne den Index neu zu erstellen?

Ich habe eine Spalte Column die als NULL DEFAULT(GETUTCDATE()) deklariert ist und es gibt einen nicht gruppierten Index, der diese Spalte enthält. Ich möchte diese Spalte ändern, um NOT NULL DEFAULT(GETUTCDATE()) und wenn ich ALTER TABLE ALTER COLUMN statement ALTER TABLE ALTER COLUMN sagt der SQL Azure Service, dass es die Spalte nicht ändern kann, da es einen Index gibt, der von dieser Spalte ALTER TABLE ALTER COLUMN .

Das ist eine Produktionsdatenbank und die Tabelle enthält etwa zehn Millionen datasätze. Also würde ich lieber nicht fallen lassen und den Index neu erstellen, denn das würde die database verlangsamen (vor allem die Erstellung des Index kann Minuten dauern).

Wie kann ich die Spalte ändern, ohne den Index neu zu erstellen?

Tabellenspalte muss nicht geändert werden, um NOT NULL zu erzwingen. Stattdessen kann der Tabelle eine neue Einschränkung hinzugefügt werden:

 ALTER TABLE [Table] WITH CHECK ADD CONSTRAINT [TableColumnNotNull] CHECK ([Column] Is NOT NULL); 

Das würde den Index nicht beeinflussen, aber der Optimierer würde diese Einschränkung nutzen, um die performance zu verbessern:

 CREATE TABLE Test (ID bigint PRIMARY KEY, [Column] DATE NULL DEFAULT(GETUTCDATE())); GO --< Create test table CREATE NONCLUSTERED INDEX TestColumnIdx ON Test ([Column]); GO --< Create the index ALTER TABLE Test ALTER COLUMN [Column] DATE NOT NULL; GO --< That won't work: the index 'TestColumnIdx' is dependent on column 'Column' Select * From Test Where [Column] Is NULL; GO --< Check the plan: it has "Index Seek (NonClustered)" ALTER TABLE Test WITH CHECK ADD CONSTRAINT TestColumnNotNull CHECK ([Column] Is NOT NULL); GO --< Add a "stand-alone" NOT NULL constraint Select * From Test Where [Column] Is NULL; GO --< Check the plan: it has "Constant Scan" now DROP TABLE Test; GO --< Clean-up 

Ich habe das auf SQL server 2012 SP1 auf einem lokalen server (dh nicht Azure) getestet und es funktioniert auch nicht. So wahrscheinlich ist es notwendig, den Index zu löschen und ihn auf Azure neu zu erstellen.

 ALTER TABLE Children ALTER COLUMN ChildName VARCHAR(50) NOT NULL 

produziert:

 Msg 5074, Level 16, State 1, Line 1 The index 'IX_Children_ChildName' is dependent on column 'ChildName'. Msg 4922, Level 16, State 9, Line 1 ALTER TABLE ALTER COLUMN ChildName failed because one or more objects access this column. 

(Natürlich ist es notwendig zu überprüfen, dass es keine NULLs in der Spalte sowieso, was wäre ein Fehler, auch wenn es keinen Index auf der Spalte)

Sorry, ich habe nicht genug Ruf zu kommentieren …