Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SSIS и установка значения переменной пакета в обработчиках событий / 11 сообщений из 11, страница 1 из 1
15.10.2021, 17:33
    #40104779
Smile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
В OnPreExecute пакета находится Задача выражения1, в которой переменной, объявленной на уровне пакета, присваивается значение 1.
В самом пакете находится Задача выражения2, в которой этой же переменной присваивается значение 2.
И за ней следует Задача "Отправка почты", в которой значение переменной отправляется на почту.
В OnPreExecute Задачи "Отправка почты" вижу (в отладчике), что значение переменной = 2.
А в OnPostExecute Задачи "Отправка почты" оно опять становится = 1. Ну и на почту падает значение 1 (что еще более не понятно ведь было же оно 2 в OnPreExecute).

Пакет бессмысленный, сделан под вопрос.
Почему 1??? И если это штатное поведение, как на него повлиять?
Переменная в пакете одна, совсем одна, ну т.е. путаница на уровне пространств имен исключена.

В реальной задаче планируется по ходу выполнения пакета собирать (склеивать) данные в переменной в OnPostExecute на отдельных задачах и потом отправлять значение переменной на мыло. Но не тут-то было =(
...
Рейтинг: 0 / 0
15.10.2021, 21:25
    #40104833
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
Smile,

Потому что обработчики событий выполняются не только для самого объекта, но также и для всех его вложенных компонент, для которых нет обработчика данного события.
У вас выполнился:
PreExecute пакета для пакета, (переменная=1)
PreExecute пакета для Задача выражения2, (снова=1)
Задача выражения2 (=2)
PreExecute пакета для Задачи "Отправка почты" (=1)
Задача "Отправка почты" (все еще =1)
...
Рейтинг: 0 / 0
15.10.2021, 22:17
    #40104842
Smile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
.Евгений,

Изначально переменной присваивалось 2 прямо в OnPreExecute «Отправки почты», а в самом пакете задач не было вообще, кроме «Отправки почты». Ситуация была ровно такой же: 1 в OnPostExecute «Отправки почты» и 1 уходило на мыло.

Ну т.е. и у пакета, и у «Отправки почты» были свои обработчики OnPreExecute.
...
Рейтинг: 0 / 0
15.10.2021, 23:00
    #40104850
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
Smile,

Потому что в обработчике Отправки почты была установлена системная переменная Propagate. Это приводит к тому, что после окончания обработчика вызывается вышестоящий обработчик (в данном случае пакета). Сбросьте указанную переменную в обработчиках задач или перепроектируйте свое решение.
...
Рейтинг: 0 / 0
15.10.2021, 23:35
    #40104853
Smile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
.Евгений,

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

А вот про то же самое в отношении обработчиков не сообразил. Спасибо, буду пробовать.

Единственное, что меня смущает, выше Вы говорите, что обработчик срабатывает и для «вложенных» объектов (спускается вниз). А в последнем примере наоборот: выталкивается вверх.

Перепроектировать? Можно обойтись и без использования обработчиков, наплодив кучу задач в самом потоке. Это затруднит визуальное восприятие основной бизнес-логики пакета. Потому сбор этой информации (по сути некое журналирование процесса) и хочется спрятать в обработчиках.
...
Рейтинг: 0 / 0
16.10.2021, 00:00
    #40104856
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
Smile

Единственное, что меня смущает, выше Вы говорите, что обработчик срабатывает и для «вложенных» объектов (спускается вниз).

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

Перепроектировать? Можно обойтись и без использования обработчиков, наплодив кучу задач в самом потоке. Это затруднит визуальное восприятие основной бизнес-логики пакета. Потому сбор этой информации (по сути некое журналирование процесса) и хочется спрятать в обработчиках.

Прежде всего, внутри SSIS есть стандартный журнал. Если он по какой-то причине не подходит, то можно организовать накопление данных вместо перезаписи. В этом случае вы бы сразу увидели последовательность вызова обработчиков и вам было бы гораздо проще разобраться с проблемой.
...
Рейтинг: 0 / 0
16.10.2021, 00:37
    #40104862
Smile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
.Евгений,

Для прикладных целей штатный журнал не совсем подходит.
Скажем так, получатель сообщения должен видеть верхнеуровневую информацию, например, что пакет не смог завершиться успешно, потому не доступен ftp, куда он должен выложить файлы. И т.а.

А для отладки да, самое-то. В целом, в SSIS не было задач и проблем такой сложности, которые требовали включение и изучение журнала.
В общем, буду изучать. Спасибо!
...
Рейтинг: 0 / 0
16.10.2021, 01:56
    #40104872
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
Smile,

По крайней мере, вы можете ограничиться обработчиком уровня пакета, который по названию вызвавшего компонента (и, возможно, другим параметрам) будет генерировать после каждого компонента новую верхнеуровневую запись (например, посредством лукапа в БД).
...
Рейтинг: 0 / 0
16.10.2021, 21:40
    #40104966
Smile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
.Евгений,

Так не очень нравится. Куда нагляднее в OnPostExecute отработавшего компонента (а точнее, в каждом нужном компоненте) сформировать нужный фрагмент текста и приклеить его к строке сообщения, которое в конце пакета и отправляется.
Ну представьте, я удалил компонент, а ещё лучше — переименовал его. Придётся править код в обработчике уровня пакета. Лениво =)

https://social.msdn.microsoft.com/Forums/sqlserver/en-US/68bdfa69-50fa-4571-850f-1f1ad0ed4785/onpostexecute-should-run-only-once?forum=sqlintegrationservices

По мне так с «фиктивным» контейнером очень красиво
...
Рейтинг: 0 / 0
16.10.2021, 23:10
    #40104987
.Евгений
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
Smile,

Ваши обработчики приклеют столько экземпляров фрагмента, сколько у них всех нижележащих компонентов+1, и вам придется проверять наличие обработчика и значение переменной Propagate для каждого из этих компонентов.
Ваш код будет размазан по множеству обработчиков, у вас не будет единой точки отказа/внесения изменений.

Наконец, наглядность в отношении обработчиков событий - не самая сильная сторона интерфейса SSIS, потому этот аспект нетрудно упустить из виду (особенно, если с таким пакетом придется разбираться кому-то еще).
...
Рейтинг: 0 / 0
17.10.2021, 13:28
    #40105021
Smile
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
SSIS и установка значения переменной пакета в обработчиках событий
.Евгений
Smile,

Ваши обработчики приклеют столько экземпляров фрагмента, сколько у них всех нижележащих компонентов+1, и вам придется проверять наличие обработчика и значение переменной Propagate для каждого из этих компонентов.
Ваш код будет размазан по множеству обработчиков, у вас не будет единой точки отказа/внесения изменений.


Ну не все так печально, конечно. Ниже лежащие можно запихать в контейнер и устанавливать Propagate=False в нужном обработчике контейнера, а не каждого компонента. Проверил, все очень хорошо работает теперь. Но да, появился "бессмысленный" контейнер. Все лучше, чем проделывать эти манипуляции с каждым компонентом в нем.

.Евгений

Наконец, наглядность в отношении обработчиков событий - не самая сильная сторона интерфейса SSIS, потому этот аспект нетрудно упустить из виду (особенно, если с таким пакетом придется разбираться кому-то еще).

Тут не поспоришь. Но в принципе, этому кому-то еще достаточно понимать, что сборка итогового сообщения ведется только в обработчиках OnPostExecute, а в контейнерах выставляется Propagate=False. В любом случаем, мне кажется, это лучше, чем "засорять" основной поток дополнительными задачами, которые лепят сообщение.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / SSIS и установка значения переменной пакета в обработчиках событий / 11 сообщений из 11, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]