SQL Server 2000 DTS. Часть 7. Задачи DTS Designer: ActiveX Script Task

ПУБЛИКАЦИИ  

По материалам статьи Marcin Policht: SQL Server 2000 DTS Part 7 - DTS Designer Tasks: the ActiveX Script task

Если Вы прочли предыдущие статьи о технологии SQL Server DTS, Вы, вероятно, обратили внимание на частое упоминание ActiveX скриптов. Несмотря на то, что создание скриптов не очень популярно среди администраторов баз данных, их возможности стоит изучить, тем более что знакомство с ними необходимо для понимания оставшихся для нашего рассмотрения типов задач. Сегодня мы рассмотрим ActiveX Script task, который активно использует создание скриптов.
Целью ActiveX Script task является исполнение VBScript (который будет использоваться в примерах) или JScript скриптов, как части DTS пакетов (скрипты на других языках также могут использоваться, если они установлены на системе где пакет был создан и там, где он будет исполнен). Чтобы создать эту задачу, выберите опцию ActiveX Script Task в меню Task окна DTS Designer (или используйте соответствующий значок инструментальной панели Task на левой стороне окна). В диалоговом окне ActiveX Script Task Properties Вы можете выбрать язык скрипта. Этим Вы зададите набор используемых функций, соответствующий выбранному языку и отображаемый в списке Functions. Рабочая, текстовая область справой стороны предназначена для ввода кода скрипта. В начале, она содержит определение функции Main, созданное автоматически и состоящие из следующих строк:

'**********************************************************************
'  Visual Basic ActiveX Script
'************************************************************************

Function Main()
	Main = DTSTaskExecResult_Success
End Function

Это определение не вносит в скрипт никаких важных функциональных возможностей, но служит отправной точкой разработки Вашего скрипта. Вы можете для пробы внести в него любые изменения и потом вернуться к исходному состоянию, нажав на кнопку Auto Gen (повторное нажатие этой кнопки приведёт к тому, что все внесённые Вами в начальный код изменения будут утеряны и снова появится представленное выше определение). Так как скрипт может содержать несколько функции, в текстовом поле Entry нужно ввести имя функции, которая должна быть исполнена (по умолчанию - Main). В любой момент Вы можете проверить правильность синтаксиса вашего кода, нажав на кнопку Parse.
Автор предполагает, что Вы знакомы с правилами написания скриптов. Если это не так, Вы можете получить вводную информацию в виде HTML справочника (.CHM) с узла Microsoft: Windows Script.
Однако, даже если Вы имеете опыт в написании скриптов, Вам нужно будет освоить элементы DTS, которые используются в ActiveX скриптах. К счастью, такие элементы легко узнаваемы, так как они всегда начинаются с префикса "DTS" и их название обычно явно указывают на их назначение. Например, сгенерированное автоматически определение, которое было показано выше, включает элемент DTSTaskExecResult_Success. Это имя определяет константу, указывающую на успешное завершение задачи. И наоборот, DTSTaskExecResult_Failure - это константа, указывающая на не успешное завершение задачи. В рамках скрипта, Вы должны определить успешность его исполнения и сигнализировать об этом, присвоив соответствующую константу Main. Например, давайте предположим, что мы хотим убедиться в наличие файла C:\Data\SourceFile.txt. Это можно сделать с помощью следующего скрипта:

Function Main()
	sFile = "C:\Data\SourceFile.txt"
	
	Set oFSO = CreateObject("Scripting.FileSystemObject")
	If oFSO.FileExists(sFile) Then
		MsgBox "The " & sFile & " exists"
		Main = DTSTaskExecResult_Success
				   
	Else
		MsgBox "The " & sFile & " does not exists"
		Main = DTSTaskExecResult_Failure
	End If
End Function

Скрипт использует объект Scripting.FileSystemObject, который содержит методы и свойства разрешений операций для файлов и папок. Мы используем метод FileExist, который позволяет определить, существует ли указанный файл. Если он существует, мы выводим в диалоговое окне подтверждение и устанавливаем значение, возвращаемое функцией Main в DTSTaskExecResult_Success. Иначе, мы изменяем выводимое сообщение и возвращаем значение, указывающее на ошибку. Обратите внимание, что вывод окон сообщений в течение исполнения задачи является плохой практикой, так как это приведёт к появлению ошибок при выполнении пакетов по расписанию, потому что они должны выполняться автоматически. Мы используем здесь окна сообщений только в целях демонстрации нашего примера.
С помощью библиотеки Scripting.FileSystemObject Вы также можете удалить DTS журнал, что можно рассматривать в качестве альтернативы решению с ExcecuteProcess, предложенному в предыдущей статье. В упрощённом варианте, ActiveX скрипт имел бы следующий вид:

Function Main()
	sFile = "C:\Logs\dts.log"
	
	Set oFSO = CreateObject("Scripting.FileSystemObject")
	If oFSO.FileExists(sFile) Then
		oFSO.DeleteFile sFile, TRUE
	End If
	Main = DTSTaskExecResult_Success
End Function

Метод DeleteFile объекта Scripting.FileSystemObject удаляет указанный Вами файл. Когда второй, дополнительный параметр этого метода установлен в TRUE, операция будет выполнена, даже если файлу установлен атрибут read-only. Теперь давайте посмотрим, как можно сделать этот скрипт более гибким, включив в него глобальные переменные.
Важно понимать, что для эффективного использования в DTS скриптов нужно быть хорошо знакомым с DTS Object model. Эта модель описывает совокупность объектов (присущие им свойства и методы), используемых для представления различных элементов DTS. В рамках этой модели существует объект Package (точнее Package2, который является следующей версией объекта Package SQL 7.0 для SQL 2000), и который содержит подобъекты: подключения, задачи (есть отдельные объекты для различных типов задач), шаги или глобальные переменные. Список возможных объектов опубликован на сайте MSDN: Creating DTS Packages with the DTS Object Model.
В начале этот список может показаться сложным для понимания, но всё станет более ясным после анализа нескольких типовых скриптов. Вы также должны иметь в виду, что при ссылке на объекты, перечисленные в списке ActiveX скриптов, необходимо добавлять префикс "DTS" (например, для представленного в списке объекта GlobalVariables нужно будет использовать DTSGlobalVariables).
DTSGlobalVariables определяет совокупность всех глобальных переменных пакета. Вы можете обращаться к ним непосредственно из ActiveX скрипта. Например, значение глобальной переменной с именем gVarLogFile может быть получено в скрипте с помощью DTSGlobalVariables("gVarLogFile").Value. Также, Вы можете создать в скрипте новую глобальную переменную, выполнив команду следующего формата (имя переменной и её значение взяты в примере произвольно):

Set DTSGlobalVariables("gVarJustCreated").Value = "Hello World"

Давайте попробуем реализовать первый подход в нашем тестовом скрипте. Мы вручную создадим в пакете глобальную переменную по имени gVarLogFile. Как Вы уже знаете, это можно сделать на закладке Global Variables диалогового окна Properties пакета. Назовём её gVarLogFile и назначим ей значение C:\Logs\dts.log. Далее, изменим код ActiveX задачи на следующий:

Function Main()
	sFile = DTSGlobalVariables("gVarLogFile").Value

	Set oFSO = CreateObject("Scripting.FileSystemObject")
	If oFSO.FileExists(sFile) Then
		oFSO.DeleteFile sFile, TRUE
	End If
	Main = DTSTaskExecResult_Success
End Function

Сохраните пакет с новым именем (например, ActiveX Test) и выполните его. Как и прежде, признаком успешного завершения работы пакета должно быть удаление предварительно созданного файла C:\Logs\dts.log.
Как Вы видите, здесь мы затронули только функциональные возможности по созданию ActiveX скриптов. Возможности задач на основе ActiveX (DTS пакетов на базе скриптов или программирования вообще) практически не ограничены, так как они обеспечивают доступ не только к компонентам DTS (через DTS object model) но также и к другим объектным моделям (например, ADO, WSH, CDO и т.д.). Эти возможности будут использоваться в следующих статьях этой серии.
При работе с задачами ActiveX Script Вы должны иметь в виду два важных момента:

  • Скрипты оперируют на той же системе, где исполняется содержащий их пакет. Этот факт может негативно повлиять на время исполнения пакета, если пакет будет запущен из Enterprise Manager на рабочей станции, а не непосредственно на сервере. Чтобы избежать этого, наметьте исполнение пакета как задание по расписанию в SQL Server Agent или запускайте их непосредственно с консоли SQL Server.
  • Избегите использовать ActiveX Script задач для построчно обработки данных, особенно при больших объёмах информации, так как такие методы имеют тенденцию длительного исполнения и повышенной утилизации процессорных ресурсов. Вместо этого, обрабатывайте такие данные непосредственно на SQL Server (до или после того, как пакет будет исполнен, в зависимости от источника и получателя данных).

Мы продолжим рассмотрение DTS задач в следующих статьях этой серии.

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


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

ПУБЛИКАЦИИ

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