Назад | Перейти на главную страницу

Добавление условий в последовательность плана обслуживания на SQL Server

Я хотел бы добавить условие к последовательности в моем плане обслуживания SQL Server 2008. Это условие основано на переменной, установленной задачей оператора T-SQL:

declare @primary bit = 0
select @primary=1
from sys.database_mirroring
where mirroring_role = 1

Как я могу выполнить эту задачу с помощью редактора ограничений приоритета?

Я согласен с SQLChicken. Вы не сможете проверить переменные с помощью простого плана обслуживания, созданного в SQL Management Studio. Вам нужно будет либо написать сценарий и поместить в задание SQL, либо создать полноценный пакет SSIS. SSIS предоставит вам все задачи плана обслуживания, доступные через SSMS, а также все другие преимущества SSIS, включая переменные пакета, которые вы можете использовать в своих ограничениях приоритета.

Честно говоря, если вы собираетесь заняться такой продвинутой настройкой, вам лучше написать решение, а затем запланировать его через агента. Планы обслуживания, хотя и удобны для действительно простых задач, действительно имеют свои ограничения.

У меня есть решение, но оно не изящно. Это работает, но это лажа и никогда не будет считаться «лучшей практикой».

Решение включает использование искусственно созданных ошибок для управления потоком и настройку свойств пакета, чтобы общее состояние ошибки вызывающего задания сообщало об успехе или неудаче так, как мы хотели бы.

Сначала создайте задачу «Выполнить оператор T-SQL» с условной проверкой. Из примера в исходном вопросе это будет выглядеть так:

if not exists (select * from sys.database_mirroring where mirroring_role = 1)
   begin
   raiserror('not primary', 16, 1)
   end

Этот код генерирует ошибку, если это не первичное зеркальное отображение, и отсутствие ошибки, если оно первичное. Затем создайте вторую задачу «Выполнение инструкции T-SQL» и свяжите ее с первой с условием «Успешно». Если это не первичное зеркало, мы не перейдем ко второй задаче, и последовательность будет завершена. Если это основная задача, мы перейдем ко второй задаче. Вторая задача генерирует фиктивную ошибку с использованием такого кода:

raiserror('dummy error', 16, 1)

Теперь создайте третью задачу и свяжите ее со второй с условием сбоя. В этой третьей задаче делайте все, что вы хотите, если условие в первой задаче было истинным. Это может быть другой оператор Execute T-SQL, задача резервного копирования, задача обновления статистики или что-то еще. Если условие было ложным, мы выйдем из последовательности после первой задачи. Если условие было истинным, мы перейдем к фиктивной ошибке и перейдем к этой третьей задаче, которая фактически выполняет ту работу, которую мы хотим выполнить.

Причина фиктивной ошибки в задаче 2 состоит в том, чтобы сделать окончательное состояние ошибки вызывающего задания таким, каким мы хотим, и есть некоторые другие свойства пакета, которые нам также необходимо настроить, чтобы это работало. Перейдите в окно свойств (если оно не открыто, откройте его из контекстного меню любой из задач) и щелкните раскрывающийся список вверху. В нем перечислены все элементы плана обслуживания, для которых вы можете изменить свойства. Щелкните на Subplan_1 Sequence, где Subplan_1 - это имя подплана, над которым вы работаете. Измените FailParentOnFailure на False. Это не позволит вызывающему заданию сообщать об ошибке, когда мы генерируем условную ошибку в задаче 1 или фиктивную ошибку в задаче 2. Затем перейдите к свойствам пакета MyPackage, где MyPackage - это имя пакета, с которым вы работаете. MaximumErrorCount равным 2. Это приведет к тому, что вызывающее задание будет сообщать об успехе, когда есть только одна ошибка, созданная фиктивной ошибкой в ​​задаче 2, но сообщать об ошибке, если третья задача также генерирует ошибку. Он также сообщит об успехе, если единственная сгенерированная ошибка связана с условной проверкой в ​​задаче 1.

Вот и все, надеюсь, кому-то это пригодится.

Для меня самый простой способ создания условных планов обслуживания без установки информационных служб на вашем экземпляре SQL - это использовать SQL Server Data Tools (SSDT):

  1. Загрузите установку SSDT отсюда (это бесплатно): https://docs.microsoft.com/en-us/sql/ssdt/download-sql-server-data-tools-ssdt
  2. Создайте новый проект SSIS. Один из файлов нового проекта: Package.dtsx Это файл XML.
  3. Выберите из базы данных XML для вашего плана обслуживания со следующим запросом:
SELECT    id, name, description, CAST(CAST(packagedata AS varbinary(MAX)) AS varchar(MAX)) xml_str
FROM  msdb.dbo.sysssispackages with(nolock)
WHERE name='your maintenance plan name';
  1. Скопируйте и вставьте значение столбца xml_str в Package.dtsx файл созданного вами проекта SSIS.
  2. Добавьте переменные и добавьте ‘Выполнить задачу SQLУзел. «Выполнение задачи SQL» позволяет извлекать данные с помощью выборок в переменных, в отличие от «Задачи выполнения инструкции T-SQL», которая есть в плане обслуживания SQL Server. После включения в план обслуживания SQL «Выполнение задачи SQL» имеет графический интерфейс, который можно редактировать непосредственно в SSMS без SSDT. Но переменные можно добавлять и редактировать только с помощью SSDT или SQL, который напрямую изменяет XML плана обслуживания. Не забывайте экономить.
  3. Скопируйте как текст в буфер обмена XML из Package.dtsx файл и обновите с помощью команды SQL план обслуживания упакованные данные поле msdb.dbo.sysssispackages стол. Теперь, если вы откроете план обслуживания с помощью SSMS, вы обнаружите, что добавленная функция «Выполнение задачи SQL» имеет графический интерфейс и прекрасно настраивается даже из SSMS.
  4. После «Выполнить задачу SQL», которая соберет необходимую информацию в переменные, создайте ограничения / связи с выражением. Ограничения / ссылки должны соединять узлы, которые должны выполняться условно. Выражения будут указывать потоку, какие ограничения / ссылки следует выполнять, а какие нет. Выражения используют данные переменных для условий. Это можно сделать через графический интерфейс SSMS без дополнительных инструментов.

Конечно, все это возможно без SSDT, только с помощью чистых SQL-команд обновления, если вы точно знаете, какой XML нужно изменить для переменных и для «Выполнить SQL-задачу» в XML-данных пакета целевого плана обслуживания. После вставки в один план обслуживания узел «Выполнение задачи SQL» можно скопировать и вставить в другие планы обслуживания через графический интерфейс SSMS без дополнительных инструментов. К сожалению, это не относится к переменным.