Вы можете изменить поле и сделать его не нулевым, не проверяя поля. Если вы действительно беспокоитесь о том, чтобы не делать это в нерабочее время, вы можете добавить ограничение в поле, которое проверяет, не является ли оно нулевым. Это позволит вам использовать опцию без проверки и не проверять каждую из 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!
На самом деле у вас есть два варианта (добавлен третий, см. редактирование):
- Используйте ограничение, которое предотвратит обновление любых новых строк и оставит исходные без изменений.
- Обновите строки, которые являются нулевыми, на что-то другое, а затем примените параметр not null alter. Это действительно должно выполняться в нерабочее время, если вы не возражаете против того, чтобы процессы были заблокированы вне таблицы.
В зависимости от вашего конкретного сценария любой вариант может быть лучше для вас. Я бы не стал выбирать этот вариант, потому что вам нужно запускать его в нерабочее время. В конечном счете, время, которое вы потратите на обновление посреди ночи, будет потрачено с пользой по сравнению с головной болью, с которой вы, возможно, столкнетесь, срезав путь, чтобы сэкономить пару часов.
При всем этом, если вы собираетесь выбрать второй вариант, вы можете свести к минимуму объем работы, которую вы выполняете в нерабочее время. Поскольку перед изменением столбца вы должны убедиться, что вы обновляете строки, чтобы они не были нулевыми, вы можете медленно писать курсор (относительно выполнения всего этого сразу)
- Пройтись по каждому ряду
- Проверьте, является ли он нулевым
- Обновите его соответствующим образом. Это займет некоторое время, но не заблокирует всю таблицу, чтобы другие программы не могли получить к ней доступ. (Не забудьте таблицу with(rowlock) намекать!)
EDIT: я только что подумал о третьем варианте: вы можете создать новую таблицу с соответствующими столбцами, а затем экспортировать данные из исходной таблицы в новую. Когда это будет сделано, вы можете удалить исходную таблицу и изменить имя новой на старое. Чтобы сделать это, вам придется отключить зависимости от оригинала и установить их обратно на новый, когда вы закончите, но этот процесс значительно сократит объем работы, которую вы должны выполнять в нерабочее время. Это тот же подход, который использует сервер sql, когда вы вносите изменения в порядок столбцов в таблицах через студию управления. Для этого подхода я бы сделал вставку по частям, чтобы убедиться, что вы не вызываете отмену нагрузки на систему и не мешаете другим получить к ней доступ. Затем в нерабочее время вы можете удалить оригинал, переименовать второй и применить зависимости и т. д. У вас все еще будет некоторая работа в нерабочее время, но она будет незначительной по сравнению с другим подходом.
Ссылка на использование sp_rename.
person
kemiller2002
schedule
20.07.2009
Sch-M
блокировка таблицы , что в принципе несовместимо. со всем. Затем он должен прочитать каждую страницу, чтобы определить, что все строки валидны. - person Martin Smith   schedule 18.05.2011