SSIS выполняется успешно, но, похоже, не выполняет часть задачи скрипта.

У меня есть пакет SSIS, который запускает SQL-запрос и экспортирует его в файл csv через задачу потока данных. После создания csv у меня есть «Задача сценария» для подключения к SMTP-серверу и отправки файла csv в виде вложения.

На моем локальном компьютере пакет работает нормально, но когда я загружаю его в SQL Server Management Studio на сервере, он не работает должным образом. SQL Server MS говорит, что пакет выполнен успешно, и файл csv создан в ожидаемом месте. Однако «Задача сценария», похоже, вообще не выполняется. Я включил в сценарий C# несколько операторов для записи в файл в целях отладки — один для блока исключений try/catch и несколько других для нормального выполнения.

    public void Main()
    {
        string sSubject = "Weekly PAX Test";
        string sBody = "Test Message";
        int iPriority = 2;

        if (SendMail(sSubject, sBody, iPriority))
        {
            Dts.TaskResult = (int)ScriptResults.Success;
        }
        else
        {
            //Fails the Task
            Dts.TaskResult = (int)ScriptResults.Failure;
        }
    }

    public bool SendMail(string sSubject, string sMessage, int iPriority)
    {
        try
        {
            string sEmailServer = Dts.Variables["User::sEmailServer"].Value.ToString();
            string sEmailPort = Dts.Variables["User::sEmailPort"].Value.ToString();
            string sEmailUser = Dts.Variables["User::sEmailUser"].Value.ToString();
            string sEmailPassword = Dts.Variables["User::sEmailPassword"].Value.ToString();
            string sEmailSendTo = Dts.Variables["User::sEmailSendTo"].Value.ToString();
            string sEmailSendFrom = Dts.Variables["User::sEmailSendFrom"].Value.ToString();
            string sEmailSendFromName = Dts.Variables["User::sEmailSendFromName"].Value.ToString();
            string sAttachmentPath = Dts.Variables["User::sAttachmentPath"].Value.ToString();

            SmtpClient smtpClient = new SmtpClient();
            MailMessage message = new MailMessage();

            MailAddress fromAddress = new MailAddress(sEmailSendFrom, sEmailSendFromName);

            //You can have multiple emails separated by ;
            string[] sEmailTo = Regex.Split(sEmailSendTo, ";");
            int sEmailServerSMTP = int.Parse(sEmailPort);

            smtpClient.Host = sEmailServer;
            smtpClient.Port = sEmailServerSMTP;

            System.Net.NetworkCredential myCredentials =
               new System.Net.NetworkCredential(sEmailUser, sEmailPassword);
            smtpClient.Credentials = myCredentials;

            message.From = fromAddress;

            if (sEmailTo != null)
            {
                for (int i = 0; i < sEmailTo.Length; ++i)
                {
                    if (sEmailTo[i] != null && sEmailTo[i] != "")
                    {
                        message.To.Add(sEmailTo[i]);
                    }
                }
            }

            switch (iPriority)
            {
                case 1:
                    message.Priority = MailPriority.High;
                    break;
                case 3:
                    message.Priority = MailPriority.Low;
                    break;
                default:
                    message.Priority = MailPriority.Normal;
                    break;
            }

            //You can enable this for Attachments.  
            //sAttachmentPath is a string variable for the file path.

            Attachment myAttachment = new Attachment(sAttachmentPath);
            message.Attachments.Add(myAttachment);


            message.Subject = sSubject;
            message.IsBodyHtml = true;
            message.Body = sMessage;

            smtpClient.Send(message);
            System.IO.File.WriteAllText("C:\\Users\\SQLCLservice\\SQLServerAgent\\file.txt", "Test");
            return true;
        }
        catch (Exception ex)
        {
            System.IO.File.WriteAllText("C:\\Users\\SQLCLservice\\SQLServerAgent\\ex.txt", ex.ToString());
            return false;

        }
    }

Электронная почта не отправляется - файлы не записываются. Как будто задача вообще не выполняется, несмотря на «Успешное выполнение».

Я заметил, что служба SQL Server Integration Services 11.0 работает на моем локальном компьютере, но не на сервере. Однако, если я отключу эту службу на своем локальном компьютере, задача все равно будет выполняться.

Я пропустил что-то еще? Я новичок в SQL Server и уже несколько дней работаю над этой проблемой.

РЕДАКТИРОВАТЬ: я использую SQL Server 2012

EDIT2: я также должен упомянуть, что я пытался сохранить пакет с 64-битной средой выполнения, установленной на false, и запустить его в 32-битном режиме через агент SQL Server.


person aufty    schedule 08.07.2015    source источник
comment
Вы проверяли журналы ошибок сервера?   -  person Tab Alleman    schedule 08.07.2015
comment
Журналы для пакета показывают успешное выполнение. Я не уверен, какие еще журналы я должен проверить.   -  person aufty    schedule 08.07.2015
comment
Вы можете проверить журналы событий Windows на сервере. Также см. здесь: msdn.microsoft.com/en -us/библиотека/ms140246(v=sql.110).aspx   -  person Tab Alleman    schedule 08.07.2015
comment
«Package WeeklyReportTest завершен успешно» — единственный журнал, который я вижу в журналах событий Windows.   -  person aufty    schedule 08.07.2015
comment
Что ж, вы можете попробовать поместить некоторые уведомления в обработчики событий до и после выполнения задачи сценария, просто чтобы убедиться, что она даже попадает туда, когда выполняется на сервере.   -  person Tab Alleman    schedule 08.07.2015
comment
По какой причине вы не используете задачу отправки почты OOB? Чтобы определить для вашего собственного здравомыслия, выполняется ли задача сценария, создайте событие внутри сценария, прежде чем вы вызовете SendMail код приблизительно Dts.Events.FireWarning(0, "This ran", "Details", string.Empty,0, ref fireAgain);, а затем, когда вы запустите его, убедитесь, что вы получаете отчеты о предупреждениях (dtexec /file MyPackage /REP EWI)   -  person billinkc    schedule 08.07.2015
comment
@billinkc Я не использую задачу отправки почты, потому что мне нужна базовая проверка подлинности, а задача отправки почты поддерживает только анонимную проверку подлинности или проверку подлинности Windows. Я попробую добавить предложенный код.   -  person aufty    schedule 08.07.2015
comment
Когда я запускаю dtexec, это ошибка, которую я получаю: Ошибка: 2015-07-08 10:48:12.87 Код: 0xC000F427 Источник: сценарий отправки почты Описание: для запуска пакета SSIS вне инструментов данных SQL Server необходимо установить сценарий отправки почты служб интеграции или выше. Завершить ошибку   -  person aufty    schedule 08.07.2015
comment
Вы получите это на своем компьютере, если у вас отключена служба служб интеграции, как вы упомянули. Когда вы запускаете пакет в режиме отладки на своем компьютере, он работает с /rep EWIP, чтобы вы могли видеть, что происходит. Как вы его запускаете на сервере - из командной строки, SQL Agent, еще как-то?   -  person billinkc    schedule 08.07.2015
comment
Я добавил это как шаг в задании под агентом SQL Server.   -  person aufty    schedule 08.07.2015
comment
Решит ли эту проблему установка служб Integration Services на сервере? Поскольку служба не отображается, я предполагаю, что она не установлена.   -  person aufty    schedule 08.07.2015


Ответы (2)


Ранее я сталкивался с похожей ситуацией, когда все отлично работало в SSDT (инструменты данных SQL Server — это интерфейс Visual Studio), и когда мой пакет развертывался в SSMS, просто задача сценария не выполнялась.

Используя SSIS 2012, я загружал лист Excel, а затем в задаче сценария я вызывал макрос Excel для сортировки и выделения различий в листе. Все работало нормально в среде SSDT, но когда я запускал в SSMS (как запланированное задание — 32-битный режим), задача сценария не выполнялась. Однако я мог видеть лист Excel, загруженный необработанными данными — без сортировки и выделения различий.

В журналах выполнения пакетов SSMS не зафиксировано ошибок. Как подчеркнул @Tab Alleman в разделе комментариев, некоторые ошибки были зарегистрированы в средстве просмотра событий. В моем случае ошибка была зарегистрирована в разделе WindowsLogs > System.

введите описание изображения здесь

Который показал ошибки разрешений для SQLSERVERAGENT при доступе к службам Microsoft SQL Server Integration Services 11.0.

Параметры разрешений для конкретного приложения не предоставляют пользователю NT SERVICE\SQLSERVERAGENT разрешение на локальную активацию для приложения COM-сервера с CLSID {FDC3723D-1588-4BA3-92D4-42C430735D7D} и APPID {83B33982-693D-4824-B42E-7196AE61BB05}.

И затем после предоставления соответствующего доступа (шаги предоставления доступа описаны здесь), я получил еще одну ошибку разрешения, в то время как учетная запись пытался получить доступ к экселю

Параметры разрешений по умолчанию для компьютера не предоставляют разрешение на локальную активацию для приложения COM-сервера с CLSID {00024500-0000-0000-C000-000000000046} и APPID {00020812-0000-0000-C000-000000000046} пользователю NT SERVICE\SQLSERVERAGENT

Даже после устранения всех ошибок разрешений я все еще не мог увидеть ожидаемый результат. Поэтому я увеличил пользовательское ведение журнала (см. шаги здесь) для задачи сценария. Затем я смог увидеть исключения, возникающие в задаче сценария. Мой блок catch выглядит примерно так:

  catch (Exception ex)
            {
               Dts.Log(ex.ToString(), 0, emptyBytes);
            }

Что будет регистрировать ошибки в таблице sysssislog (которую вы должны были настроить при настройке пользовательского ведения журнала)

select * from [*YourDatabaseName*].[dbo].[sysssislog]

Должен перечислить ваши пользовательские журналы.

person Karthik    schedule 27.08.2015

Я тоже сталкивался с похожей ситуацией, но решил ее по-другому. У меня было две ключевые задачи в моем пакете SSIS. Задача сценария, работающая на C#, и задача потока данных, читающая файл Excel. Я впервые получил эту ошибку:

OLE DB provider Microsoft.Jet.OLEDB.4.0 is not registered.  If the 64-bit drive is not installed, run the package in 32-bit mode.

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

Основная причина того, что моя задача «Сценарий» не выполнялась, заключалась в том, что она компилировалась для x64 (настройка по умолчанию). Вот мои шаги, которые я использовал, чтобы исправить это:

  1. Изменить сценарий
  2. Щелкните правой кнопкой мыши имя проекта С#, похожее на GUID, и выберите свойства.
  3. Выберите меню «Сборка» в левой части страницы свойств.
  4. Установите цель платформы = x86

Теперь ваша задача «Сценарий» будет работать в 32-битном режиме вместе с вашим 32-битным драйвером OLEDB Jet.

person behonji    schedule 16.09.2016