С помощью операции DBCC CHECKDB можно проверить логическую и физическую целостность всех объектов в определенной базе данных. По умолчанию она возвращает результаты проверки на консоль пользователя при выполнении в среде SQL Server Management Studio. Недавно после моего доклада о приемах работы со средой SQL Server Management Studio на конференции IT/DEV Connections в Лас-Вегасе ко мне подошел участник с вопросом, как получить результаты по электронной почте. Поначалу мне показалось, что решение будет довольно простым. Я думал, что достаточно создать задание агента SQL Server из двух шагов. Первый — выполнить команду DBCC CHECKDB и сохранить результаты в статическом текстовом файле, перезаписываемом при каждом выполнении запланированного задания. На втором шаге, выполняемом независимо от успеха или неудачи первого, команда sp_send_dbmail отправляет текстовый файл определенному получателю или списку получателей по электронной почте. Такой ответ казался мне удовлетворительным, пока я не протестировал его и не понял, что оказался прав на 90-95%.

Работоспособное решение

Предложенное мною решение было бы удачным, если бы не выходные файлы. Я сторонник использования выходных файлов в заданиях агента SQL Server, так как они могут быть более подробными, чем запись выходных данных шага в файл (другой возможный вариант). Дело в том, что существуют пределы длины записи, ограничивающие информацию, которую можно сохранить. Кроме того, по умолчанию выходные данные шага не задействованы при создании процесса, поэтому их легко пропустить. В чем же была проблема? Просто нужно было убедиться, что в обоих шагах не используется один и тот же файл. Обычно, чтобы избежать нового выходного файла при каждом выполнении задания, я создаю задание со статическим именем. При этом на первом шаге перезаписывается существующий файл (если он есть), а затем каждый шаг в этом выполнении задания дополняет его. В конечном итоге получается статический файл с выходными данными для всех шагов, упорядоченными для цикла выполнения задания.

Проблема, свойственная решениям, при выполнении которых нужно передать сформированный файл, заключается в том, что нельзя отправить открытый файл. Хотя один и тот же пользователь (в данном случае SQL Server Agent) одновременно открыл файл и является «отправителем». Поэтому самое простое решение — отказаться от выходного файла для второго шага или иметь другой файл для записи выходных данных на втором шаге.

Чтобы действительно упростить представление, посмотрим на проблему с точки зрения графического интерфейса SQL Server Management Studio.

Новое задание агента SQL Server

Создайте новое задание, которое в итоге будет состоять из двух шагов — одного для запуска DBCC CHECKDB с параметрами, необходимыми для этого процесса, и одного для отправки сообщения с результатами по электронной почте (см. экран 1). Два шага для этого задания выполняются, как показано на экране 2.

 

Создание нового задания агента SQL Server
Экран 1. Создание нового задания агента SQL Server

 

Выполнение двух шагов для задания
Экран 2. Выполнение двух шагов для задания

Шаг первый — команда DBCC CHECKDB, она приведена на экране 3, а ход выполнения показан на экране 4.

 

Страница команды первого шага
Экран 3. Страница команды первого шага

 

Ход выполнения первого шага
Экран 4. Ход выполнения первого шага

Шаг второй — команда sp_send_dbmail, ее вы видите на экране 5, а ход выполнения представлен на экране 6.

 

Страница команды второго шага
Экран 5. Страница команды второго шага

 

Ход выполнения второго шага
Экран 6. Ход выполнения второго шага

В рассматриваемой ситуации можно применить команды DBCC CHECKDB к отдельным базам данных или выполнить несколько шагов и отправить результаты по электронной почте списку получателей. Однако подход не ограничивается командами DBCC CHECKDB: он применим к любому процессу, в котором нужно предупредить сотрудников об ограничениях или результатах запроса.