С помощью операции 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.
Экран 1. Создание нового задания агента SQL Server |
Экран 2. Выполнение двух шагов для задания |
Шаг первый — команда DBCC CHECKDB, она приведена на экране 3, а ход выполнения показан на экране 4.
Экран 3. Страница команды первого шага |
Экран 4. Ход выполнения первого шага |
Шаг второй — команда sp_send_dbmail, ее вы видите на экране 5, а ход выполнения представлен на экране 6.
Экран 5. Страница команды второго шага |
Экран 6. Ход выполнения второго шага |
В рассматриваемой ситуации можно применить команды DBCC CHECKDB к отдельным базам данных или выполнить несколько шагов и отправить результаты по электронной почте списку получателей. Однако подход не ограничивается командами DBCC CHECKDB: он применим к любому процессу, в котором нужно предупредить сотрудников об ограничениях или результатах запроса.