Обработчики событий SSIS только для уровня пакета

У меня есть несколько пакетов, которые нужно запускать в определенном порядке. Для этого у меня есть дополнительный пакет, который запускает все остальные.
Я добавил обработчики событий к каждому вызову пакета, чтобы показать пользователю статус процесса (выполнение, успех, сбой) с помощью OnError, OnPreExecute и OnPostExecute.

Чего я не осознавал, так это того, что при каждом успешном выполнении каждой части пакета он возвращает OnPostExecute, а затем новый OnPreExecute при запуске следующей части того же пакета.
Это вызывает путаницу у пользователя, поскольку он думает, что этап был завершен, но затем видит, что он все еще выполняется.

Как я могу сделать так, чтобы обработчики событий ссылались только на события уровня пакета?
Любые другие предложения также будут оценены.

Спасибо!


person Gidil    schedule 17.10.2013    source источник


Ответы (2)


Решением, которое я придумал, было бы использование одной из системных переменных, доступных в обработчиках событий. В каждой из областей OnPreExecute, OnPostExecute и OnError вы можете найти как минимум переменную @[System::SourceName].

@[System::SourceName] содержит имя задачи, вызывающей событие.

С его помощью вы можете проверить, было ли событие вызвано самим пакетом верхнего уровня, одной из задач «Выполнение пакета» или любой другой задачей в пакете.
Таким образом, даже если мы не можем остановить множественные вызовы, мы можем контролировать реакцию.

Например, скорее всего, вы бы использовали ограничение приоритета на основе @[System::SourceName], которое проверяет, является ли это общим именем пакета.

Это не самое элегантное решение (для этого потребуется либо иметь согласованные имена задач EP, либо жестко закодировать их в обработчиках событий), но оно работает.

К сожалению, я не смог найти способ предотвратить возникновение событий из подпакетов в основном.

person White_Raven    schedule 22.10.2013
comment
Это отлично. Я бы сказал, что это не неэлегантно, особенно по сравнению с несколькими другими доступными вариантами. - person Mike M; 10.06.2014

Простое решение — создать таблицу журнала событий SSIS в базе данных и указать пользовательскую переменную для каждого параметра обработчика событий, которые доступны в списке. Затем возьмите задачу «Выполнение SQL» для создания соединения и добавьте следующий запрос в

INSERT INTO dbo.SSIS_events (EIGUID, PackageName, SourceName, EventInfo) VALUES (?,?,?,'OnPreExecute')

Для отслеживания конкретной задачи.

person Mitul Panchal    schedule 31.12.2018