SQL Server 2000 DTS. Часть 6. Задачи DTS Designer и Package Workflow

ПУБЛИКАЦИИ  

По материалам статьи Marcin Policht: SQL Server 2000 DTS Part 6 - DTS Designer Tasks and Package Workflow

Как было обещано в предыдущей статье, мы продолжаем обсуждение разных способов использования глобальных переменных в задачах DTS Designer. В частности, мы изучим их роль в обмене данными между пакетами и особенности использования Execute Package task. Заодно мы узнаем, для чего можно использовать DTS Package Workflow.
Основная цель Execute Package task прямо и ясно отражена в его названии - обеспечение возможности исполнение одного пакета в рамках другого (далее мы будем называть такие пакеты, как дочерние и родительские пакеты). Такая возможность позволяет повторно использовать код и получить преимущества модульного дизайна, размещая часто используемые функции в отдельных пакетах. Реализуется эта возможность простым вызовом существующего дочернего пакета с установленными для него параметрами. Поместив типовую функциональность в отдельном пакете, Вы можете вносить изменения в алгоритм её работы в одном месте, а отражаться эти изменения будут везде, где используется этот пакет.
Давайте рассмотрим пример. DTS предоставляет нам возможность записывать сообщения и сведения об ошибках в процессе исполнении пакета в файл журнала (очень полезная возможность для разрешения проблем), однако, эта информация добавляется всегда в конец существующего файла. Кроме того, в DTS нет встроенной функции очистки файла регистрации ошибок. Чтобы как то решить эту проблему, Вы можете создать специальный пакет, который будет удалять журнал (это относительно просто сделать с помощью ActiveX скрипта или Execute Package task) и включить его в каждый пакет, работу которого Вы хотите контролировать более детально. Другим преимуществом использования Execute Package task является возможность внедрения в пакет скрытых от пользователя возможностей (например, осуществлять дополнительную проверку безопасности).
Давайте продемонстрируем описанные выше возможности, создав для этого два пакета. В Enterprise Manager щёлкните правой кнопкой мыши по иконке Local Packages в папке Data Transformation Services и выберете из контекстного меню опцию New Package. Журнал мы будем удалять с помощью Execute Process task, поэтому в меню Task (или на инструментальной панели Task с левой стороны окна DTS Package), выберите пункт Execute Process task, и в открывшемся диалоговом окне Execute Process Task Properties, введите следующую информацию:


Description:   Delete DTS Log
Win32 process: %ComSpec%
Parameters:    /C del C:\Logs\dts.log
Return code:   0
Timeout:       2

Нотация %ComSpec% определяет переменную среды, указывающую на местоположение CMD.EXE. Мы будем использовать одну из внутренних команд операционной системы - DEL, вызываемую как один из параметров процесса Win32. В нашем случае, местом расположения файла регистрации будет: C:\Logs\dts.log, но, вы может изменить это место по своему усмотрению. Код возврата = 0 будет указывать на успешное завершение. Время ожидания (Timeout) = 2 определяет время, по истечении которого процесс будет принудительно завершён. Чтобы проверить работу этого пакета, сохраните его под именем "Delete DTS Log" и создайте текстовый файл C:\Logs\dts.log (его содержание является несущественным). Теперь нужно выполнить пакет (нажав зеленый треугольник в инструментальной панели или выбрав опцию Execute в меню Package) или выполнить задачу (щёлкнув правой кнопкой мыши на ней и выбрав в раскрывшемся контекстном меню Execute). Вы увидите промелькнувшее окно Command Prompt и подтверждение, что пакет или шаг (в зависимости от того, как Вы его запускали) был успешно выполнен. Если Вы проверите содержание папки C:\Logs, то увидите, что файла dts.log там больше нет. Поскольку мы хотим продемонстрировать использование для связи между пакетами глобальных переменных, мы должны устранить жесткую зависимость от имени процесса Win32 и значений его параметров. Достигается это за счёт использования задачу Dynamic Properties Task, которую мы рассматривали в предыдущей статье. В меню Task добавьте задачу Dynamic Properties Task. В её окне Package Properties, щёлкните по кнопке Add, после чего разверните на левой панели открывшегося окна узел Tasks, и выберете запись DTSTask_DTSCreateProcessTask_1. Для этой записи выберете элемент ProcessCommandLine, так что бы он стал подсвеченным. После этого нажмите на кнопке Set, и Вы увидите диалоговое окно Add/Edit Assignment. В списке Source, установите указатель вниз на элемент Global Variable и нажмите кнопку Create Global Variables. Добавьте следующую глобальную переменную:


Name:   gVarCmdLine
Type:   String
Value:  %comspec% /C del C:\Logs\dts.log

Нажмите OK, и Вы вернетесь в диалоговое окно Add/Edit Assignment. В нём, в списке Variable раздела Source, выберите недавно созданную переменную gVarCmdLine. И на последок, в описании задачи замените название "Dynamic Properties Task:undefined" на более понятное: "Set Command Line". После того, как Вы закроете диалоговое окно, Вы должны увидеть в окне DTS Package две задачи: "Delete DTS Log" и "Set Command Line". Также, мы должны гарантировать, что задача Dynamic Properties Task будет выполнятся первой, так как наша новая глобальная переменная должна быть установлена до выполнения процесса Win32. Это можно сделать путём установки порядка исполнения задач, в определении логики пакета - DTS Package Workflow.
DTS Package Workflow определяет последовательность выполнения отдельных задач в рамках пакета. Есть три разных типа порядка исполнения, которые Вы можете определить между двумя задачами (ради простоты, давайте называть их: Task A и Task B, где Task B, как ожидается, следует за Task A):

  • Unconditional - Task B выполнится после завершения Task A, независимо от результата его завершения.
  • On Success - Task B выполнится, только если Task A завершится успешно.
  • On Failure - Task B выполнится, только если Task A завершиться с ошибкой.

В окне DTS Package порядок исполнения задаётся указанием мышью первого, а затем второго по порядку исполнения задания и затем нужно выбрать соответствующий тип порядка в Workflow. В нашем случае, сначала выделите значок Set Command Line, затем Delete DTS Log и выберите значок On Success в меню Workflow. Опять создайте фиктивный журнал (C:\Logs\dts.log) и, как только Вы сохраните и выполните пакет, Вы должны увидеть тот же результат, как и в предыдущей проверке исполнения пакета (dts.log будет удалён).
Теперь пришло время создать родительский пакет, который будет содержать задачу Execute Package task. Начнём опять с создания пакета (выбрав опцию New Package в контекстном меню Local Packages из папки Data Transformation Services). Как только откроется окно DTS Package, выберете Execute Package Task в меню Task и в диалоговом окне Properties укажите следующее:


Description:   Execute Package Example
Location:      SQL Server
Package name:  Delete DTS Log

Указываемый в этом окне режим и параметры аутентификации будут зависеть от настройки вашего SQL Server. Имя пакета (и версия) может быть введено вручную (не рекомендуется) или выбрано от списка существующих пакетов, если щёлкнуть по кнопке - (...). Если на SQL сервере пакет "Delete DTS Log" один - единственный (и есть он только одной версии), его имя появится в текстовом поле имени пакета. Иначе, Вам нужно будет выбрать его вместе с версией (обозначенной датой и временем создания). Как правило, достаточно выбрать имя пакета (вместо указателей на версии с временными метками), и это будет указывать на то, что всегда должна использоваться последняя версия пакета. В первом случае, у Вас будет использоваться ссылка на GUID пакета, а во втором на GUID версии (они обе отображаются на закладке General диалогового окна Properties пакета). Использование GUID версии означает, что Вы должны будете каждый раз корректировать опцию "Package NAME", чтобы указать ссылку на последнюю версию, если Вы вносите изменения в пакет (предполагается, что Вы хотите всё время иметь наиболее современную версию). Если Вы хотите удалить ссылку на GUID версии или целого пакета (чтобы избежать проблемы в случае, если дочерний пакет будет заменён другим с таким же именем), Вы можете удалить PackageID с помощью Disconnected Edit (доступный в меню Package окна DTS Package). Открыв окно Edit All Package Properties, Вы можете просмотреть свойства Execute Package Task и удалить значение соответствующего PackageID.
Диалоговое окно Execute Package Task Properties имеет две дополнительных закладки, это Inner и Outer Package Global Variables. В начале они обе пусты, и Вы можете указать в них глобальные переменные, используемые соответственно для дочернего (Inner) или родительского (Outer) пакета. Например, в нашем случае на вкладке Inner Package Global Variables мы можем увидеть и изменить значение для переменной gVarCmdLine (определенное в дочернем пакете Delete DTS Log). Точно так же, если бы были определены глобальные переменные в неком родительском пакете, мы могли были добавить их в список на вкладке Outer Package Global Variables (хотя для них нет возможности внесения изменение на этой закладке, такие изменения значений можно сделать на закладке Global Variables родительского пакета в диалоговом окне Properties). Важно указать, что внутренние и внешние переменные пакета будут использоваться для определения переменных, которые необходимо передавать дочернему пакету. Главное различие между ними в том, что внутренние (Inner) устанавливаются на уровне задачи, а внешние (Outer) на уровне пакета.
Вы можете пронаблюдать, как используется Inner Package Global Variables, просто выбрав gVarCmdLine из списка в разделе Variables и убедившись, что в поле значений появится: "%comspec% /C del C:\Logs\dts.log". Также, в случае необходимости, здесь Вы можете изменять это значение. Чтобы использовать Outer Package Global Variables, вначале удалите ссылку на переменную на закладке Inner Package Global Variables (если внутренние и внешние переменные пакета имеют одинаковые имена, внутренние будут иметь приоритет). Далее, в родительском пакете создайте глобальную переменную. Как было описано ранее, это может быть сделано на закладки Global Variables в диалоговом окне DTS Package Properties. В нашем случае, Вы должны были бы определить gVarCmdLine с соответствующим значением. После этого, gVarCmdLine добавляется в список на вкладке Outer Package Global Variables. Очевидно, для успешного исполнения, Вы должны указать правильные параметры аутентификации для родительского пакета (указав соответствующую информацию на закладке Logging диалогового окна DTS Package Properties).
В нашей следующей статье, мы продолжим рассмотрение остающихся типов задач DTS Package.

[В начало]    [К следующей статье цикла]


Перевод: Александра Гладченко  2004г.

ПУБЛИКАЦИИ

Скачать электронную карту Ангарска бесплатно
Сайт управляется системой uCoz