Редактор Control Flow
Редактор Control Flow похож на DTS 2000 в том, что он содержит задачи и зависимости их запуска, но отличается наличием некоторых новых объектов-контейнеров, о которых следует знать. Эти контейнеры - For Loop, Foreach Loop, Sequence, а также задача Data Flow - содержат другие компоненты, которые производят определенного вида действия. Последовательность процессов в пакете задается с помощью редактора Control Flow. Редактор представляет собой рабочую область, в которой графически определяется, как задачи взаимодействуют между собой и порядок, в котором они будут выполняться.
После добавления новой задачи редактор Control Flow автоматически добавляет к ней стрелку или, иначе говоря, ограничение приоритета, с помощью которого данная задача может быть соединена с другими. Это показано на Рисунке 14.
Рисунок 14
Если Вы нажмете кнопкой мыши в любую часть стрелки или линии, то Редактор пакетов изменит ее на пунктирную линию. Теперь можно перетянуть стрелку на другую задачу и выбрать ее в качестве задачи-приемника нажатием кнопки мыши. Редактор соединит две задачи таким образом, что та задача, в которую направлена стрелка, будет запущена только в том случае, когда предшествующая задача будет успешно завершена (см. Рисунок 15).
Рисунок 15
Если нужно, чтобы задача-преемник была выполнена только в том случае, когда задача-предшественник закончиться неудачно, то необходимо дважды нажать кнопку мыши на линии, соединяющей эти две задачи для вывода диалога Precedence Constraint. В этом диалоге можно поменять результат выполнения на любой доступный, но если выбрать OnFailure и затем нажать OK, то цвет линии изменится на красный. На Рисунке 16 показано диалоговое окно Precedence Constraint Editor со своими опциями конфигурации.
Рисунок 16
Если необходимо, чтобы задача-преемник была запущена при любом результате завершения задачи-предшественника, то нужно изменить ограничение приоритета на OnCompletion и тогда цвет линии поменяется на синий.
Наличие в пакете только двух задач подразумевает только одно ограничение приоритета между ними. Если же пакет требует нескольких задач, то также можно добавить несколько ограничений приоритета между всеми задачами для создания столь сложных зависимостей, сколь необходимо пакету. На Рисунке 17 изображен немного более сложный пример процесса обработки и то, как SSIS позволяет осуществлять больший контроль над ходом выполнения.
Рисунок 17
Новшеством в SQL Server 2005 является наличие логических условий AND и OR в случае, если у задачи есть множество ограничений приоритета. В DTS 2000 подобная задача могла быть запущена только в случае, когда все ограничения приоритета выполнялись. Это, безусловно, было проблемой в том случае, когда у какой-либо задачи было два или более ограничения приоритета для случая неудачного завершения задач-предшественников. Потому, что все эти задачи-предшественники обязательно должны были закончиться неудачно, чтобы сработала задача-преемник. В SQL Server 2005 при двойном нажатии кнопкой мыши на ограничении приоритета в появившемся диалоге кроме условия срабатывания Success, Failure, или Completion можно выбрать как взаимодействуют между собой множественные условия срабатывания - по AND или по OR. Логическое AND означает, что все ограничения приоритета должны быть выполнены для запуска задачи-преемника. Логическое OR означает, что для запуска задачи-преемника достаточно выполнения одного из ограничений приоритета. В первом случае линия, соединяющая задачи будет сплошной, а во втором - пунктирной. На Рисунке 18 показан диалог для задания ограничения приоритета подзадачи только при неудачном завершении, но разрешающий запуск подмножества задач.
Рисунок 18
Такая возможность позволяет создать в SSIS логический поток такого вида, что изображен на Рисунке 19. На этом примере видно, что любая задача пакета, окончившаяся неудачно, приведет к запуску задачи Error Handler. Это позволяет создавать для группы задач единую задачу "обработки ошибок".
Рисунок 19