|
По материалам статьи Microsoft: INF: How to Run a DTS Package as a Scheduled Job (Q269074)
1. Введение Информация в этой статье относиться к Microsoft SQL Server версий 7.0 и 2000 (все издания)
Одной из распространённых проблем, связанных с
использованием Data Transformation Services (DTS), состоит в
том, что DTS пакет выполняется без ошибок в SQL Server
Enterprise Manager, но наблюдаются сбои в работе DTS пакета,
когда он выполняется как задание по расписанию. Обычно, это
происходит из-за отличий в контексте безопасности, когда пакет
выполняется как задание и когда он выполняется в интерактивном
режиме. Эта статья призвана помочь в разрешении проблем
безопасности, связанных с запуском на выполнение DTS
пакетов. 2. Кто является владельцем DTS пакета? Пакеты оформленные, как задание по расписанию, соответственно управляются сервисом SQL Agent. Это задание, как любое другое задание по расписанию, имеет владельца (Owner). Владельцем может быть SQL Server логин или учетная запись Windows NT. Определить владельца задания можно следующим образом: Дважды щёлкните по заданию в Enterprise Manager, и затем
посмотрите поле с раскрывающимся списком
Owner. Контекст безопасности, в котором задание выполняется,
определяется владельцем задания. Если задание принадлежит
логину, который не является членом серверной роли Sysadmin, то
пакет будет исполнен в контексте специальной учетной записи
SQLAgentCmdExec, и задание будет иметь её права и
разрешения. 3. Как устанавливается владелец задания? Когда Вы щёлкаете правой кнопкой мыши по DTS пакету и определяете его в виде задания по расписанию, присвоение владельца этому заданию зависит от того, как SQL Server зарегистрирован в Enterprise Manager. Если SQL Server зарегистрирован через Windows NT аутентификацию, владельцем задания по расписанию будет учетная запись, от имени которой стартует сервис SQL Agent. Если SQL Server зарегистрирован в EM с помощью собственной аутентификации SQL Server (например, под логином SA), владельцем задания будет тот же самый логин SQL сервера. Изменение владельца пакета осуществляется следующим образом: 1. Дважды щёлкните по заданию в Enterprise Manager. Также Вы можете использовать системную хранимую процедуру msdb.dbo.sp_update_job, с помощью которой можно изменить владельца пакета. Если Вы запускаете пакет вручную, используя утилиту
командной строки DTSrun.exe, контекст безопасности будет как у
учётной записи Windows, под которой Вы зарегистрировались на
компьютере. Если Вы запускаете пакет, используя DTSrun.exe
через расширенную хранимую процедуру xp_cmdshell, пакет будет
выполнен в контексте учетной записи, от имени которой стартует
сервис SQL Server, при условии, что пользователь, который
выполнил xp_cmdshell, является членом роли Sysadmin. Если
пользователь, который выполнил xp_cmdshell, не включён в роль
Sysadmin, то DTSrun.exe выполнится в контексте учетной записи
SQLAgentCmdExec. 5. Как Windows NT аутентификация используется при подключениях? Иногда DTS пакет содержит объект, который создаёт подключение к источнику данных используя Windows NT аутентификацию. Контекст безопасности, используемый для этого подключения, будет тот же самый, как у контекста пакета, который выполняется. Если пакет запускается из командной строки через DTSRun.exe, используются права учетной записи Windows NT, под которой зарегистрировались на компьютере. Если пакет выполняется как задание SQL Server Agent, то подключение будет создано от учетной записью, от имени которой стартован сервис SQL Agent (принимаем, что владелец пакета является членом роли Sysadmin). Ниже представлено описание нескольких типичных проблем, с которыми Вы можете столкнуться при запуске DTS пакетов в виде заданий по расписанию. 6.1. Обозначенные буквой диски (Mapped Drives): Если в пакете используется путь к файлу с обозначенным буквой, распределённым в сети диском, исполнение пакета по расписанию завершиться неудачно независимо от того, кто является владельцем пакета. SQL Agent - как сервис Windows NT и любой сервис Windows NT не могут видеть обозначенные буквой, распределённые в сети диски. Обозначенные буквой диски являются частью профиля пользователя, который загружается при его входе в сеанс Windows NT. Сервисы не работают с параметрами пользователя. Используйте путь в формате UNC вместо обозначенных буквой дисков. Относительный путь (путь через имя диска) может определять текущее расположение пакета (например: C:\). Если пакет разработан на рабочей станции и используется в задании по расписанию, относительные пути, использованные в пакете при его исполнении на сервере, могут измениться. Относительный путь это ссылка, которая может указывать на другое физическое расположение на сервере. Если указываемые в этой ссылке файлы на сервере не будут находиться в таком же, как на рабочей станции месте, произойдёт сбой в выполнении пакета. 6.3. Использование COM компонент в ActiveX сценариях: Если компоненты COM (например, запросы Microsoft ActiveX Data Objects (ADO), Remote Data Objects (RDO) или объекты Decision Support Object (DSO)) вызываются в сценарии ActiveX, эти компоненты должны существовать на компьютере, на котором DTS пакет будет исполняться. Если Вы выполняете пакет с помощью DTS Designer в EM или через DTSrun.exe, эти компоненты должны существовать на компьютере, на котором Вы в этот момент работаете. Если пакет оформлен, как задание по расписанию, необходимые компоненты должны быть загружены на компьютере, где запущен SQL Server. DTS пакеты могут использовать пароль владельца и пользовательские пароли. Эти пароли существенны только для тех, кто может редактировать и исполнять пакеты. Ни один из них не влияет на контекст безопасности, в котором пакет исполняется. 6.5. Разрешения для SQLAgentCmdExec: Если задание выполняется в контексте учетной записи SQLAgentCmdExec, и учетная запись SQLAgentCmdExec не имеет прав входа в SQL Server, задание может закончиться неудачно со следующим сообщением об ошибке: DTSRun: Loading... DTSRun: Executing... DTSRun OnStart: DTSStep_DTSExecuteSQLTask_1 DTSRun OnError: DTSStep_DTSExecuteSQLTask_1, Error = -2147217843 (80040E4D) Error string: Login failed for user 'NT_name\SQLAgentCmdExec'. Error source: Microsoft OLE DB Provider for SQL Server Help file: Help context: 0 Error Detail Records: Error: -2147217843 (80040E4D); Provider Error: 18456 (4818) Error string: Login failed for user 'NT_name\SQLAgentCmdExec'. Error source: Microsoft OLE DB Provider for SQL Server Help file: Help context: 0 DTSRun OnFinish: DTSStep_DTSExecuteSQLTask_1 DTSRun: Package execution complete. Process Exit Code 1. The step failed. Вы должны обеспечить для SQLAgentCmdExec необходимый для правильной работы логин с соответствующими правами к базе данных. |
Перевод: Александра Гладченко 2002г. |