|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
В OnPreExecute пакета находится Задача выражения1, в которой переменной, объявленной на уровне пакета, присваивается значение 1. В самом пакете находится Задача выражения2, в которой этой же переменной присваивается значение 2. И за ней следует Задача "Отправка почты", в которой значение переменной отправляется на почту. В OnPreExecute Задачи "Отправка почты" вижу (в отладчике), что значение переменной = 2. А в OnPostExecute Задачи "Отправка почты" оно опять становится = 1. Ну и на почту падает значение 1 (что еще более не понятно ведь было же оно 2 в OnPreExecute). Пакет бессмысленный, сделан под вопрос. Почему 1??? И если это штатное поведение, как на него повлиять? Переменная в пакете одна, совсем одна, ну т.е. путаница на уровне пространств имен исключена. В реальной задаче планируется по ходу выполнения пакета собирать (склеивать) данные в переменной в OnPostExecute на отдельных задачах и потом отправлять значение переменной на мыло. Но не тут-то было =( ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 17:33 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
Smile, Потому что обработчики событий выполняются не только для самого объекта, но также и для всех его вложенных компонент, для которых нет обработчика данного события. У вас выполнился: PreExecute пакета для пакета, (переменная=1) PreExecute пакета для Задача выражения2, (снова=1) Задача выражения2 (=2) PreExecute пакета для Задачи "Отправка почты" (=1) Задача "Отправка почты" (все еще =1) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 21:25 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
.Евгений, Изначально переменной присваивалось 2 прямо в OnPreExecute «Отправки почты», а в самом пакете задач не было вообще, кроме «Отправки почты». Ситуация была ровно такой же: 1 в OnPostExecute «Отправки почты» и 1 уходило на мыло. Ну т.е. и у пакета, и у «Отправки почты» были свои обработчики OnPreExecute. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 22:17 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
Smile, Потому что в обработчике Отправки почты была установлена системная переменная Propagate. Это приводит к тому, что после окончания обработчика вызывается вышестоящий обработчик (в данном случае пакета). Сбросьте указанную переменную в обработчиках задач или перепроектируйте свое решение. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 23:00 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
.Евгений, Я пользуюсь этим, например, когда нужно, чтобы исключение, возникшее в задаче, не выталкивалось выше на уровень контейнера и/или пакета. И таким образом перехватываю/обрабатываю исключение в управляющем поток нужным мне образом. А вот про то же самое в отношении обработчиков не сообразил. Спасибо, буду пробовать. Единственное, что меня смущает, выше Вы говорите, что обработчик срабатывает и для «вложенных» объектов (спускается вниз). А в последнем примере наоборот: выталкивается вверх. Перепроектировать? Можно обойтись и без использования обработчиков, наплодив кучу задач в самом потоке. Это затруднит визуальное восприятие основной бизнес-логики пакета. Потому сбор этой информации (по сути некое журналирование процесса) и хочется спрятать в обработчиках. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.10.2021, 23:35 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
Smile Единственное, что меня смущает, выше Вы говорите, что обработчик срабатывает и для «вложенных» объектов (спускается вниз). Не совсем так. Это не обработчик спускается вниз, а событие поднимается вверх (как и ошибка, которая есть вид события) от компонента-источника к пакету, если по пути не наткнется на обработчик ошибки. Этот обработчик может как остановить ошибку, так и отправить ее дальше вверх. Smile Перепроектировать? Можно обойтись и без использования обработчиков, наплодив кучу задач в самом потоке. Это затруднит визуальное восприятие основной бизнес-логики пакета. Потому сбор этой информации (по сути некое журналирование процесса) и хочется спрятать в обработчиках. Прежде всего, внутри SSIS есть стандартный журнал. Если он по какой-то причине не подходит, то можно организовать накопление данных вместо перезаписи. В этом случае вы бы сразу увидели последовательность вызова обработчиков и вам было бы гораздо проще разобраться с проблемой. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 00:00 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
.Евгений, Для прикладных целей штатный журнал не совсем подходит. Скажем так, получатель сообщения должен видеть верхнеуровневую информацию, например, что пакет не смог завершиться успешно, потому не доступен ftp, куда он должен выложить файлы. И т.а. А для отладки да, самое-то. В целом, в SSIS не было задач и проблем такой сложности, которые требовали включение и изучение журнала. В общем, буду изучать. Спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 00:37 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
Smile, По крайней мере, вы можете ограничиться обработчиком уровня пакета, который по названию вызвавшего компонента (и, возможно, другим параметрам) будет генерировать после каждого компонента новую верхнеуровневую запись (например, посредством лукапа в БД). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 01:56 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
.Евгений, Так не очень нравится. Куда нагляднее в OnPostExecute отработавшего компонента (а точнее, в каждом нужном компоненте) сформировать нужный фрагмент текста и приклеить его к строке сообщения, которое в конце пакета и отправляется. Ну представьте, я удалил компонент, а ещё лучше — переименовал его. Придётся править код в обработчике уровня пакета. Лениво =) https://social.msdn.microsoft.com/Forums/sqlserver/en-US/68bdfa69-50fa-4571-850f-1f1ad0ed4785/onpostexecute-should-run-only-once?forum=sqlintegrationservices По мне так с «фиктивным» контейнером очень красиво ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 21:40 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
Smile, Ваши обработчики приклеют столько экземпляров фрагмента, сколько у них всех нижележащих компонентов+1, и вам придется проверять наличие обработчика и значение переменной Propagate для каждого из этих компонентов. Ваш код будет размазан по множеству обработчиков, у вас не будет единой точки отказа/внесения изменений. Наконец, наглядность в отношении обработчиков событий - не самая сильная сторона интерфейса SSIS, потому этот аспект нетрудно упустить из виду (особенно, если с таким пакетом придется разбираться кому-то еще). ... |
|||
:
Нравится:
Не нравится:
|
|||
16.10.2021, 23:10 |
|
SSIS и установка значения переменной пакета в обработчиках событий
|
|||
---|---|---|---|
#18+
.Евгений Smile, Ваши обработчики приклеют столько экземпляров фрагмента, сколько у них всех нижележащих компонентов+1, и вам придется проверять наличие обработчика и значение переменной Propagate для каждого из этих компонентов. Ваш код будет размазан по множеству обработчиков, у вас не будет единой точки отказа/внесения изменений. Ну не все так печально, конечно. Ниже лежащие можно запихать в контейнер и устанавливать Propagate=False в нужном обработчике контейнера, а не каждого компонента. Проверил, все очень хорошо работает теперь. Но да, появился "бессмысленный" контейнер. Все лучше, чем проделывать эти манипуляции с каждым компонентом в нем. .Евгений Наконец, наглядность в отношении обработчиков событий - не самая сильная сторона интерфейса SSIS, потому этот аспект нетрудно упустить из виду (особенно, если с таким пакетом придется разбираться кому-то еще). Тут не поспоришь. Но в принципе, этому кому-то еще достаточно понимать, что сборка итогового сообщения ведется только в обработчиках OnPostExecute, а в контейнерах выставляется Propagate=False. В любом случаем, мне кажется, это лучше, чем "засорять" основной поток дополнительными задачами, которые лепят сообщение. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.10.2021, 13:28 |
|
|
start [/forum/topic.php?fid=46&msg=40104862&tid=1684196]: |
0ms |
get settings: |
9ms |
get forum list: |
12ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
171ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
49ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 277ms |
0 / 0 |