Ежедневная задача проверки и архивирования баз закончилась с ошибкой. Просмотр логов показал, что у одной базы нарушена целостность.
Запустил проверку этой базы вручную:
DBCC CHECKDB('DB4') WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY
Результат следующий:
Msg 2570, Level 16, State 3, Line 1 Page (1:667076), slot 0 in object ID 1932559410, index ID 1, partition ID 72057857351876608, alloc unit ID 72057857125515264 (type "In-row data"). Column "_Fld5071" value is out of range for data type "numeric". Update column to a legal value. CHECKDB found 0 allocation errors and 1 consistency errors in table '_Document197_VT5051' (object ID 1932559410). CHECKDB found 0 allocation errors and 1 consistency errors in database 'DB4'.
Значение столбца _Fld5071 в одной из строк "улетело" за границы диапазона. Статья MS 923247 говорит о том, что ошибку 2570 нельзя исправить автоматическими средствами исправления.
Все 122 000 строк таблицы имеют значение ноль в данном столбце, за исключением одной, это сильно упрощает. Тут есть небольшая хитрость, поскольку значение вне диапазона, то не надо его пытаться вывести в явном виде, будет ошибка переполнения. Сначала проверяем, что такая строка действительно одна:
SELECT COUNT(*) FROM [DB4].[dbo].[_Document197_VT5051] WHERE [_Fld5071] <> 0 1
Затем обновляем значение:
UPDATE [DB4].[dbo].[_Document197_VT5051] SET [_Fld5071] = 0 WHERE [_Fld5071] <> 0 (1 row(s) affected)
И еще раз проверку:
DBCC CHECKDB('DB4') WITH NO_INFOMSGS, ALL_ERRORMSGS, DATA_PURITY Command(s) completed successfully.
Полезная статья по терминам.