ИНФО: Разработка, развертывание и производительность пакетов DTS

Переводы статьи Переводы статьи
Код статьи: 242391 - Vizualiza?i produsele pentru care se aplic? acest articol.
Развернуть все | Свернуть все

В этой статье

Аннотация

Задачей этой статьи является предоставление подробных сведений для помощи в разработке и развертывании пакетов SQL Server 7.0 Data Transformation Services (DTS). Кроме того, предлагаются советы по повышению производительности пакета.

Сведения по этой теме, относящиеся к SQL Server 2000, приведены в электронной документации по SQL Server.

Дополнительная информация

Гибкость подключения данных

Пакет DTS является полностью автономной системой. Все сведения о подключении передаются в коллекцию свойств подключений в заданное время, даже сведения о подключениях в ссылках UDL и именах наборов данных ODBC. Если имя набора данных ODBC DSN или ссылка UDL OLEDB изменяется после создания пакета, эти изменения не будут иметь никакого воздействия на пакет. Это необходимо помнить при попытке переноса пакетов из среды разработки в производственную среду.

При работе с данными подключения SQL Server используйте (Local) в качестве названия сервера, чтобы облегчить процесс переноса пакета с сервера на сервер, поскольку название сервера разрешается во время выполнения пакета. Необходимо учитывать, что такой подход требует выполнения и правки пакета на компьютере SQL Server.

Кроме того, можно использовать задачу сценария ActiveX или программу обертки для изменения свойств пакета во время выполнения. Для изменения пакета во время его выполнения создайте задачу сценария ActiveX, которая предшествует задачам приема-передачи данных, и измените пакет во время его работы. Для получения дескриптора пакета используйте DTSGlobalVariables.Parent. С его помощью вы можете изменять любые свойства пакета, хотя эти действия требуют некоторого опыта программирования.

Далее приводится пример из раздела "Задачи сценария ActiveX" электронной документации по SQL, в котором показано, как изменить свойство подключения DataSource при помощи сценария ActiveX:
   Function main()
   dim oPackage
   dim oConn

     'Получить объект пакета
     set oPackage = DTSGlobalVariables.parent
     'Получить дескриптор к желаемому подключению.
     set oConn = oPackage.connections(1)
     'Изменить источник данных.
     oConn.datasource = "newServerName"

     'Освободить дескрипторы объектов.
     set oPackage = nothing
     set oConn = nothing

    Main = DTSTaskExecResult_Success
End function
				
Если необходимо получить дополнительный контроль и дополнительное программирование не является нежелательным, попробуйте изменять пакет при помощи внешней программы до того, как он запускается, или создайте пакет с нуля.

Для создания программы для загрузки и изменения пакета создайте шаблон пакета с использованием мастера DTS или конструктора DTS и сохраните его. Напишите программу на Visual Basic, которая загружает пакет и изменяет указанные свойства, затем вызовите метод Execute в объекте пакета, чтобы запустить пакет.

Для создания программы, которая создает пакет с нуля, создайте прототип пакета с использованием мастера DTS или конструктора DTS и сохраните его на локальном SQL Server. Используйте служебную программу ScriptPkg из приведенной ниже статьи базы знаний Майкрософт для создания шаблона для кода пакета:
239454 ИНФО: Средство ScriptPkg создает модельный код объекта DTS для программного использования DTS (Эта ссылка может указывать на содержимое полностью или частично на английском языке)
(данная ссылка может указывать на материал полностью или частично на английском языке) Используя этот шаблон в качестве образца, напишите свой собственный код для создания пакета, основанного на данных, введенных пользователем.

Обратите внимание, что в обеих описанных выше ситуациях проект Visual Basic должен иметь ссылку на библиотеку объектов Miscrosoft DTSPackage.

ВНИМАНИЕ! При выполнении пакета из программы, написанной в Visual Basic, и наблюдении за событиями пакета или задач все действия в пакете должны быть настроены для выполнения в основном потоке. Это связано с ограничением в Visual Basic, которое не дает должным образом обрабатывать множественные одновременные запросы к его событиям.

Контроль над пакетами при помощи глобальных переменных

Глобальные переменные доступны только из задач сценариев ActiveX, сценариев Workflow и преобразований ActiveX. Они не могут использоваться напрямую в операторах SQL или свойствах подключения. Тем не менее, задача сценария ActiveX может быть использована для изменения оператора SQL или свойств подключения, основанных на глобальной переменной. Вот пример задачи сценария ActiveX, которая может использоваться для изменения оператора SQL для задачи приема-передачи данных, основанной на глобальной переменной под названием 'booktype':
Function Main()
   dim oPackage
   dim oPump

        'Получить дескриптор для объекта пакета.
	set oPackage = DTSGlobalVariables.Parent
	'Получить дескриптор для желаемой задачи приема-передачи данных.
	set oPump = oPackage.Tasks("DTSTask_DTSDataPumpTask_1").CustomTask   
	'Изменить оператор SQL для приема-передачи данных.
	oPump.SourceSQLStatement = "select * from pubs..titles WHERE type _
  = ''" + DTSGlobalVariables("booktype") + "''"
	Main = DTSTaskExecResult_Success
End Function
				
Примечание. Описание задачи отображается в конструкторе DTS, но его нельзя использовать для прямой ссылки на задачу в сценарии ActiveX. Для ссылки на задачу из сценария ActiveX необходимо использовать название задачи. Название задачи можно узнать, найдя название действия в свойствах потока операций. Название задачи будет таким же, как и название действия, за исключением того, что слово "Step" будет заменено на слово "Task". Например, DTSStep_DTSDataPumpTask_1 становится DTSTask_DTSDataPumpTask_1.

Передача параметров пакету DTS

Программа DTSRun не принимает никаких параметров командной строки, которые могут быть переданы пакету во время выполнения. Для передачи информации пакету во время выполнения параметры должны быть получены из файла или запрошены из таблицы базы данных программным путем.

Примечание. Если на сервере, на котором по умолчанию установлен SQL Server 7.0, установить средства SQL Server 2000 или именованный экземпляр SQL Server 2000, программа DTSRun сможет принимать параметр /A командной строки для передачи значений из командной строки в глобальные переменные, определенные в пакете DTS для SQL Server 7.0.

Вот пример задачи сценария ActiveX, которая читает строку из текстового файла для установки глобальной переменной. Эта глобальная переменная затем может быть использована для изменения поведения пакета, как показано в разделе этой статьи "Управление пакетами при помощи глобальных переменных".
Function main()
  Dim fso	'Это будет дескриптором для объекта файловой системы.
  Dim ofile	'Дескриптор для доступа к файлу.

    'Получить объект файловой системы для файлов обработки.
    Set fso = CreateObject("Scripting.FileSystemObject")

    'Открыть текстовый файл.
    Set ofile = fso.OpenTextFile("c:\test.txt")

    'Прочитать строку из файла в глобальную переменную.
    DTSGlobalVariables("myGlobalVar").Value = ofile.ReadLine

    'Закрыть файл "параметра".
    ofile.Close

    Main = DTSTaskExecResult_Success
End function
				
В следующем примере показано, как использовать задачу сценария ActiveX для чтения параметров из таблицы SQL Server. Код читает значение столбца paramvalue в таблице my_param_table и использует его для установки глобальной переменной. В этом примере для взаимодействия с SQL Server используются объекты распределенного управления (DMO) SQL, однако можно добиться такого же результата и при помощи объектов данных ActiveX (ADO) или другого метода доступа к данным.
Function main()
Dim oServer 		'Объект сервера DMO.
Dim oResult		'Набор результатов.
Dim sParamValue

	'Создать объект сервера SQLDMO.
	Set oServer =  CreateObject("SQLDMO.SQLServer")

	' Создать подключение к локальному серверу.
	oServer.Connect ".", "sa"

	'Выбрать необходимую строку из таблицы.
	set oResult = oServer.Databases("pubs").ExecuteWithResults_
("select  paramvalue from  my_param_table")

	'Извлечь первую строку, первый столбец из результатов.
	sParamValue = oResult.GetColumnString (1,1)

	'Установить глобальную переменную.
	DTSGlobalVariables("MyGlobalVar").Value = sParamValue

	Main = DTSTaskExecResult_Success
End function
				

Написание пользовательских задач DTS на Visual Basic

Пользовательские задачи DTS можно писать на Visual Basic. Пример пользовательской задачи на Visual Basic без пользовательского интерфейса представлен в каталоге \Devtools\Samples\DTS на компакт-диске SQL Server. Далее приводится список обычных проблем, возникающих при работе с пользовательскими задачами на Visual Basic в DTS.
  1. Пользовательские задачи, написанные на Visual Basic и использующие такой интерфейс, как DTS.CustomTaskUI, ДОЛЖНЫ реализовывать каждое событие интерфейса, иначе они вызовут нарушение прав доступа.
  2. Если вы разрабатываете пользовательскую задачу Visual Basic с пользовательским интерфейсом, рекомендуется использовать SQL Server с пакетом обновления 1 (SP1). В состав пакета обновления 1 (SP1) входит несколько улучшений, позволяющих облегчить разработку пользовательского интерфейса.
  3. Задачи Visual Basic Tasks являются потоковыми, а DTS - нет. Задача, написанная в Visual Basic, должна выполняться в основном потоке, иначе она вызовет нарушение прав доступа. DTS устанавливает соответствующий флаг по умолчанию. Пользователь не должен изменять этот флаг.

Получение информации о том, как кодировать пакеты DTS

В SQL 7.0 есть несколько примеров на компакт-диске в папке \Devtools\Damples\DTS. В их число входят примеры примеры пользовательской задачи (Visual Basic) и пользовательского преобразования (C++). Некоторые примеры пакетов также находятся в самораспаковывающемся выполняемом файле DTSDemo.exe.

Наиболее универсальным является пример ScriptPkg, являющийся частью Dtsdemo.exe. В состав ScriptPkg входит исходный код на Visual Basic, преобразующий пакет, сохраненный на локальном сервере, в код на Visual Basic. Этот пример наилучшим образом используется для следующих целей.
  1. Создания примеров на Visual Basic путем написания сценариев для существующего пакета DTS.
  2. Демонстрации того, как кодировать драйвер неструкутрированного файла DTS, не описанный в электронной документации по SQL.
  3. Преобразования пакета в текст, чтобы его можно было добавлять и отслеживать в SourceSafe.
Существует несколько известных проблем, относящихся к примеру ScriptPkg.
  1. Некорректно написанный сценарий для поиска приема-передачи данных.
  2. Если пакет слишком большой, то созданный текст не может считаться одной функцией в Visual Basic вследствие ограничения на количество строк в одной функции. Необходимо разбить файл сценария на множество функций, чтобы Visual Basic смог скомпилировать код.

Улучшение производительности пакета DTS

Использование параллельных загрузок

DTS может запускать множество задач параллельно. Однако каждое подключение в пакете DTS может обрабатывать только один поток одновременно. Это означает, что следующие приемы-передачи данных в пакете будут выполняться последовательно:

A -> B и A -> B
A -> B и A -> C
A -> B и C -> B

Нет никакой разницы в том, используются одинаковые или разные значки для подключения.

Единственным способом выполнять задачи параллельно является создание множественных подключений к одной и той же базе данных, но с разными названиями. Например, A -> B и C -> D выполняются параллельно, даже если B и D являются разными подключениями к одному и тому же серверу и базе данных.

Ограничения очередности можно использовать для установления порядка выполнения заданий и в необходимых случаях предотвращения параллелизма для определенных задач.

Размер для выполнения вставки

Наиболее важным параметром задачи приема-передачи данных является Размер для выполнения вставки. Это свойство имеет значение только в том случае, когда местом назначения является SQL Server. Оно контролирует количество введенных строк перед выполнением транзакции. По умолчанию его значение равно 0; все строки являются частью одной транзакции. Это наиболее безопасный параметр, поскольку при любой ошибке SQL Server откатывает все изменения. Однако это может потребовать увеличения размера журнала транзакций, что ведет к более длительному ожиданию ответа, когда пакет отменяется, и может снизить производительность, если одна строка в конце большой загрузки приводит к сбою всей загрузки. В конце каждого интервала выполнения наблюдается заметная пауза в то время, как выполняется вставка строк в базу. Размер для выполнения, равный 0, является самым быстрым; другими приемлемыми значениями в порядке понижения скорости являются 10,000, 1000 и 1. Значение 1 является очень хорошим, поскольку при любом сбое откат происходит только на 1 строку.

Обратите внимание на то, что установка счетчика ошибок на любую цифру > 1 не имеет результата, если введенный размер для выполнения равен 0. Счетчик ошибок считает количество передач без ошибок, а не количество строк.

В SQL Server 7.0 можно настраивать значение Размер для выполнения вставки в разделе Движение данных во вкладке Дополнительно свойств задачи по преобразованию данных.

DTS и распределенные транзакции

Пакеты DTS поддерживают распределенные транзакции для поставщиков, поддерживающих DTC. Для того чтобы пакет и поэтапные транзакции работали, необходимо запустить службу DTC. Кроме того, каждый поставщик в транзакции должен поддерживать DTC.

Свойства транзакции пакета контролируются вкладкой Дополнительно свойств пакета.

По умолчанию каждый этап в пакете обрабатывает свою собственную транзакцию и не координирует свои транзакции при помощи DTC. Для внесения задачи в транзакцию DTC необходимо установить флажок "присоединиться к транзакции при наличии" в свойствах потока операций задачи. В число других параметров транзакции DTC для задачи входят "Выполнить транзакцию после успешного завершения этого действия" и "Откатить транзакцию при сбое".

Обратите внимание, что пакеты не поддерживают Microsoft Transaction Server (MTS).

Сообщения об ошибках

Когда вы используете Local для сервера базы данных для подключения из пакета, затем пакет изменяется с другого сервере, а вносящий изменения хочет посмотреть на преобразования, появляется следующее сообщение об ошибке.
Источник ошибки: Описание ошибки поставщика Microsoft OLE DB для SQL Server : Невозможно открыть базу данных, запрошенную при входе в сеть 'xxxxxxx'. Ошибка входа в сеть."

Свойства

Код статьи: 242391 - Последний отзыв: 29 декабря 2007 г. - Revision: 1.0
Информация в данной статье относится к следующим продуктам.
  • Microsoft SQL Server 7.0 Standard Edition
Ключевые слова: 
kbinfo KB242391

Отправить отзыв

 

Contact us for more help

Contact us for more help
Connect with Answer Desk for expert help.
Get more support from smallbusiness.support.microsoft.com