SSIS - FTP - сбой при запуске из задания, но нормально, когда вручную - программирование
Подтвердить что ты не робот

SSIS - FTP - сбой при запуске из задания, но нормально, когда вручную

Я пытаюсь держаться подальше от другого пакетного файла, возможно. У меня есть пакет SSIS, который извлекает данные из SQL, создает текстовый файл и затем отправляет эти файлы на внешний ftp-сайт. Пакет работает, если я запускаю его вручную либо с моей рабочей станции, либо с сервера. Однако, когда я запускаю его как шаг в SQL-задании, этот шаг выходит из строя - пакет не удается подключиться.

Данные вытягиваются с использованием задачи SQL, для создания текстовых файлов используется контейнер для каждого цикла. Затем для части ftp используется Script Задача.

В целях устранения неполадок в рамках задачи Script я помещаю текст после каждого действия с кодом, с информацией, чтобы показать, где происходит ошибка. Я получаю пользователя, выполняющего задание, значение определенных переменных и строку соединения, а затем записываю это в таблицу журналов. Вот как я знаю, что пакет терпит неудачу, когда он пытается подключиться - я получаю ложное логическое значение из ftp.Connect().

В пакете есть переменные для информации о подключении ftp, и я использую файлы конфигурации для этих значений. Тем не менее, я жестко закодировал значения в коде для тестирования, и он дает те же результаты.

Я также попытался добавить новое подключение к диспетчеру соединений и использовать существующий - без разницы.

Я исключил проблемы с сетью/блокировкой/брандмауэром. Сервер разрешает подключение ftp.

Я также попытался запустить пакет вручную как сам, и как пользователь домена, который запускает пакет SSIS из заданий (пользователь домена sqlagent). Как с моей рабочей станции, так и с сервером выполняется ее работа вручную из любой учетной записи. Чтобы запустить его вручную с моей рабочей станции, я использую отладку Visual Studio. Чтобы запустить его вручную с сервера, я использую "Запустить пакет" при подключении к экземпляру служб Integration Services на сервере.

В приведенном ниже фрагменте кода я скопировал и вставлял части задачи Script - он должен содержать весь ftp-код. Я не вставлял часть получения имени файла и отправки файлов. Ошибка всегда происходит на соединительной части.

То, что я хотел бы, это либо 1) помощь в его работе, либо 2) помощь в определении того, как получить больше ответа от ftp.Connect - логическое только не говорит мне много, ИЛИ 3) кто-то, кто эксперт, говорящий мне, что я просто должен использовать пакетный файл и перестать биться головой о стену:)

Я обещаю, что провел много исследований, и я нашел много сообщений о том, как делать ftp, но не решить эту проблему. Опять же, код работает, поэтому я знаю, как самому сделать часть ftp. Если есть дубликат сообщения, которого я не видел, я извиняюсь и буду читать оттуда вместо того, чтобы кто-то опубликовал ответ здесь.:)

Дополнительные данные: Сервер - Windows 2008 Enterprise SP2; Рабочая станция - Windows XP SP3; SQL/SSIS: SQL Server 2008 R2

Шаг задания SQL - Тип: пакет SSIS; Выполняется как: учетная запись службы агента SQL Server (учетная запись домена, называемая sqlagent); Аутентификация: аутентификация Windows

Script Код задачи:

string errMsg = null;
errMsg = "user: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name + "; ";
ConnectionManager cm = Dts.Connections["FTP_ABN"];
cm.ConnectionString = Dts.Variables["FTP_url"].Value.ToString() + ":21." + Dts.Variables["FTP_username"].Value.ToString();
cm.Properties["ServerName"].SetValue(cm, Dts.Variables["FTP_url"].Value.ToString());
cm.Properties["ServerPort"].SetValue(cm,"21");
cm.Properties["ServerUserName"].SetValue(cm, Dts.Variables["FTP_username"].Value.ToString());
cm.Properties["ServerPassword"].SetValue(cm, Dts.Variables["FTP_password"].Value.ToString());
FtpClientConnection ftp = new FtpClientConnection(cm.AcquireConnection(null));
ftpConnected = ftp.Connect();
if (ftpConnected) {    
errMsg += " - I connected: True; " + cm.ConnectionString.ToString() + "; ";
ftp.Close();
if (errMsg != null) { Dts.Log("YES - I am ok: " + errMsg, 0, new byte[0]); }
Dts.TaskResult = (int)ScriptResults.Success;
}
else {
errMsg += " - I connected: False; " + cm.ConnectionString.ToString() + "; ";
Dts.Log("Error: " + errMsg, 0, new byte[0]);
Dts.TaskResult = (int)ScriptResults.Failure;
}
4b9b3361

Ответ 1

Я ценю всех, кто ответил! Я хотел отметить это как ответ, если у кого-то еще есть проблема. Выполнение этой задачи в SQL-задании выполняется как 32-разрядный режим. Я собираюсь исследовать больше и узнать, почему и блог об этом - надеюсь, кто-то еще не должен будет проходить через все стоны и стоны, которые происходили в моей голове:)

Мне действительно нужно начинать отвечать на некоторые вопросы здесь - так как вы были так полезны и отзывчивы. Еще раз спасибо!:)

Ответ 2

У меня была эта точная проблема вчера. Script не удалось выполнить в качестве запланированной задачи, но он успешно сработал, когда я запустил его, а Script использует безопасный ftp. Проблема для меня заключалась в том, что когда я вошел в систему, используя мой локальный логин, я вручную принял защищенный сертификат шифрования ftp. Поэтому, когда я запускал его из своего логина, он успешно работал.

Я исправил его, войдя в систему как пользователь, который владеет/запускает запланированные задачи, а затем я вызвал ftp pgrogram (core ftp) и принял защищенный сертификат ftp.

Я надеюсь, что это исправит и для вас!

Ответ 3

Из интереса вы пытались использовать FTP-задачу?

У меня было несколько проблем с работой FTP, и я нашел, что одна из этих задач помогла мне.

Если вы попытались использовать FTP-задачу, вы получили сообщения об ошибках?