Вы можете изменить поле и сделать его не нулевым без проверки полей. Если вы действительно беспокоитесь о том, чтобы не делать это в нерабочее время, вы можете добавить ограничение к полю, которое проверяет, чтобы убедиться, что оно не равно нулю. Это позволит вам использовать опцию без проверки и не проверять каждую из 4 миллионов строк, чтобы увидеть, обновляется ли она.
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!
На самом деле у вас есть два варианта (добавлен третий, см. Редактирование):
- Используйте ограничение, которое предотвратит обновление любых новых строк и оставит исходные без изменений.
- Обновите строки, которые являются нулевыми, на что-то другое, а затем примените параметр не нулевого изменения. Это действительно должно быть выполнено в нерабочее время, если вы не возражаете против процессов, заблокированных за столом.
В зависимости от вашего конкретного сценария, любой из вариантов может быть лучше для вас. Я бы не стал выбирать вариант, потому что вы должны запустить его в нерабочее время. В конечном счете, время, которое вы тратите на обновление в середине ночи, будет хорошо потрачено по сравнению с головными болями, с которыми вы, возможно, столкнетесь, если будете сокращать время, чтобы сэкономить пару часов.
Это все, как говорится, если вы собираетесь использовать второй вариант, вы можете минимизировать объем работы, которую вы выполняете в нерабочее время. Поскольку перед изменением столбца необходимо убедиться, что строки обновлены до значения, не равного NULL, вы можете написать курсор медленно (относительно выполнения всего этого сразу)
- Пройти через каждый ряд
- Проверьте, является ли оно нулевым
- Обновите его соответствующим образом.
Это займет некоторое время, но не заблокирует доступ всей таблицы к другим программам. (Не забудьте с (rowlock) табличной подсказкой!)
РЕДАКТИРОВАТЬ : Я просто подумал о третьем варианте:
Вы можете создать новую таблицу с соответствующими столбцами, а затем экспортировать данные из исходной таблицы в новую. Когда это будет сделано, вы можете удалить исходную таблицу и изменить имя новой на старую. Для этого вам нужно будет отключить зависимости от оригинала и установить их обратно на новую, когда вы закончите, но этот процесс значительно сократит объем работы, которую вам придется выполнять в нерабочее время. Это тот же подход, который используется сервером sql при внесении изменений в порядок столбцов в таблицах через среду управления. Для этого подхода я бы сделал вставку по частям, чтобы убедиться, что вы не вызовете отмены нагрузки на систему и не позволите другим получить к ней доступ. Затем в нерабочее время вы можете удалить оригинал, переименовать вторую, применить зависимости и т. Д. У вас все равно останется работа в нерабочее время, но она будет незначительной по сравнению с другим подходом.
Ссылка на использование sp_rename .