Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 SSIS остановить выполение пакета  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Всем добрый день, коллеги!

В качестве ETL используется SSIS (2008R2).
Часть логики по обновлению хранилища сделана с помощью хранимой процедуры, выполняемой с помощью
SQL Task. Учитывая что хранимика делает достаточно много работы было сделано распараллеливание средствами SSIS -
в пакете параллельно запускаются несколько экземпляров процедуры с разными параметрами.
Есть одно неудобство - если один из параллельно выполняемых тасков падает то пакет продолжает выполение.
т.е. если при паралельном запуске ошибка произошла скажем на 10 минуте, по пакет будет ждать выполения остальных потоков и только после их завершения упадет с ошибкой (через 2 часа). Есть ли какой-то простой способ полностью остановить выполнение пакета и не ждать пока выполнится все ?
17 сен 12, 17:15    [13177753]     Ответить | Цитировать Сообщить модератору
 Re: SSIS остановить выполение пакета  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
ну разве что паралелить не внутри SSIS а уже сами вызовы SSIS
17 сен 12, 18:20    [13178283]     Ответить | Цитировать Сообщить модератору
 Re: SSIS остановить выполение пакета  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
Fire83
Есть ли какой-то простой способ полностью остановить выполнение пакета и не ждать пока выполнится все ?
В тасках или пакете таких свойств нету.
Можно самому сделать для каждого выполнения переход на шаг обработки ошибок, в котором убивать коннекты этого пакета.
17 сен 12, 18:51    [13178461]     Ответить | Цитировать Сообщить модератору
 Re: SSIS остановить выполение пакета  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
Ivan Durak
ну разве что паралелить не внутри SSIS а уже сами вызовы SSIS

Вызов идет из джоба, делать отдельные джобы для каждого вызова - не очень хорошо т.к. придется значительно менять архитектуру всего ETL процесса.. Но пока что-то простого решения не вижу
17 сен 12, 18:53    [13178466]     Ответить | Цитировать Сообщить модератору
 Re: SSIS остановить выполение пакета  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
alexeyvg,

А как узнать коннекты своего пакета? Лазить по sys.dm_exec_connections и пытаться выщемить?
Да и на KILL нужны сисадминские привилегии.. имхо зыбкий путь
17 сен 12, 18:58    [13178483]     Ответить | Цитировать Сообщить модератору
 Re: SSIS остановить выполение пакета  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31429
Fire83
Да и на KILL нужны сисадминские привилегии.. имхо зыбкий путь
Да, путь не очень...

Fire83
А как узнать коннекты своего пакета? Лазить по sys.dm_exec_connections и пытаться выщемить?
Да, лазить по системным представлениям. Можно в коннекте установить параметр Application Name и искать по нему
17 сен 12, 19:20    [13178549]     Ответить | Цитировать Сообщить модератору
 Re: SSIS остановить выполение пакета  [new]
Критик
Member

Откуда: Москва / Калуга
Сообщений: 33929
Блог
Чем ставить подпорки - лучше направьте больше ресурсов на тестирование.

Если есть падения, то есть и сообщение об ошибке, и, если подумать, то наверняка можно будет поправить логику процедуры.

ps в одном из проектов использовалась аналогичная система, все было нормально
17 сен 12, 20:15    [13178812]     Ответить | Цитировать Сообщить модератору
 Re: SSIS остановить выполение пакета  [new]
Ivan Durak
Member

Откуда: Minsk!!!
Сообщений: 3618
У нас таки паралелятся SSIS пакеты. Имхо - самое удобное.
18 сен 12, 12:48    [13181672]     Ответить | Цитировать Сообщить модератору
 Re: SSIS остановить выполение пакета  [new]
Fire83
Member

Откуда: Гомель-Минск
Сообщений: 474
В общем в моем случае все-таки удалось внутри хранимки логику сделать, особенность в том что там есть цикл по метаданным и это спасает:
  • Хранимка создает общую глобальную таблицу типа ##ETLProcessingFlag (id identity(1,1)) и вставляет туда одна запись
  • В начале каждой итерации по метаданным проверяется существование таблицы, если её нету то кидается эксепшн и выполнение останавливается
  • Если дошли до конца процедуры, таблица существут и SELECT COUNT(*) FROM ##ETLProcessingFlag = 0 (нету выполняемых потоков) то спокойно делаем DROP ##ETLProcessingFlag
  • В Catch блоке делается DROP ##ETLProcessingFlag также, разумеется, с проверкой существования

    Вроде как взлетело. Конечно отработает только в случае если CATCH поймаем ошибку но все же лучше чем ничего...
    Может как проще/надежнее можно? Какие мысли у кого?
  • 18 сен 12, 18:29    [13184472]     Ответить | Цитировать Сообщить модератору
    Все форумы / Microsoft SQL Server Ответить