È possibile modificare un campo e renderlo non nullo senza controllare i campi. Se sei davvero preoccupato di non farlo fuori orario, puoi aggiungere un vincolo al campo che controlla per assicurarsi che non sia nullo. Ciò ti consentirà di utilizzare l'opzione senza controllo e di non dover controllare ciascuna delle 4 milioni di righe per vedere se si aggiorna.
CREATE TABLE Test
(
T0 INT Not NULL,
T1 INT NUll
)
INSERT INTO Test VALUES(1, NULL) -- Works!
ALTER TABLE Test
WITH NOCHECK
ADD CONSTRAINT N_null_test CHECK (T1 IS NOT NULL)
ALTER COLUMN T1 int NOT NULL
INSERT INTO Test VALUES(1, NULL) -- Doesn't work now!
Davvero si hanno due opzioni (aggiunto un terzo vedere Modifica):
- utilizzare il vincolo che impedirà eventuali nuove righe vengano aggiornati e lasciare inalterati quelli originali.
- Aggiorna le righe null a qualcos'altro e quindi applica l'opzione non nullo. Questo dovrebbe essere eseguito in orari non attivi, a meno che non ti dispiaccia che i processi siano bloccati fuori dal tavolo.
A seconda del proprio scenario specifico, entrambe le opzioni potrebbero essere migliori per voi. Non sceglierei l'opzione perché devi eseguirla in ore non lavorative. A lungo termine, il tempo dedicato all'aggiornamento nel cuore della notte sarà ben speso confrontato con il mal di testa che potresti affrontare prendendo una scorciatoia per risparmiare un paio d'ore.
Detto questo, se avete intenzione di andare con l'opzione numero due, potete ridurre al minimo la quantità di lavoro che fate in ore non lavorative. Dal momento che si deve fare in modo di aggiornare le righe di non nulli prima di modificare la colonna, si può scrivere un cursore lentamente (rispetto a fare tutto in una volta)
- passare attraverso ogni fila
- controllare per vedere se è nullo
- Aggiornare in modo appropriato. Questo ci vorrà un bel po ', ma non bloccherà l'intero blocco di tabella da altri programmi di accedervi. (Non dimenticare il suggerimento with(rowlock) tavolo!)
EDIT: ho pensato di una terza opzione: È possibile creare una nuova tabella con le colonne appropriate, e quindi esportare i dati dalla tabella originale a quello nuovo. Fatto ciò, puoi rilasciare la tabella originale e cambiare il nome di quello nuovo in quello vecchio. Per fare ciò dovrai disabilitare le dipendenze sull'originale e reimpostarle su quella nuova quando hai finito, ma questo processo ridurrà di molto la quantità di lavoro che devi fare nelle ore di pausa. Questo è lo stesso approccio utilizzato da sql server quando si effettuano le modifiche alle ordinazioni delle colonne alle tabelle attraverso lo studio di gestione. Per questo approccio, farei l'inserto in blocchi per assicurarmi che tu non provochi l'annullamento dello stress sul sistema e impedisca ad altri di accedervi. Poi, nelle ore libere, puoi lasciare l'originale, rinominare il secondo e applicare le dipendenze, ecc. Avrai ancora un po 'di lavoro fuori orario, ma sarà minimo rispetto all'altro approccio.
Collegamento all'uso di sp_rename.
Personalmente non avrei mai fare un cambiamento per la struttura della tabella in una tabella di grandi dimensioni esistente in qualsiasi momento, tranne le ore di punta.Anche se è abbastanza veloce, può far sì che gli utenti nel processo di fare le cose nel momento in cui apportate la modifica abbiano problemi. Qualsiasi modifica importante viene eseguita al meglio anche in modalità utente singolo. È molto meglio avere un periodo di manutenzione programmata in black out quando gli utenti non possono fare nulla (annunciato prima del corso e durante le ore non di punta), piuttosto che avere utenti infelici che stavano facendo qualcosa che sta ricevendo errori. – HLGEM
La colonna che si sta modificando è coinvolta nei vincoli FK? – onupdatecascade
Da un rapido test in profiler ci vuole un lock 'Sch-M' sul tavolo [che è fondamentalmente incompatibile con tutto] (http://msdn.microsoft.com/en-us/library/ms186396.aspx). Quindi deve leggere ogni pagina per determinare che tutte le righe vengano convalidate. –