Почему скрипт SSIS vb правильно обнаруживает, что файл существует при выполнении в VS, но не из SQL Server - PullRequest
3 голосов
/ 12 июня 2019

У меня проблемы с созданным мной пакетом служб SSIS, который в конечном итоге проверит, существует ли файл Excel, если не отправит электронное письмо с сообщением об ошибке.Если он существует, данные загружаются в таблицу, а файл Excel удаляется.Это работает, когда я выполняю пакет в Visual Studio, но не когда я развертываю его на SQL Server.Проблема в том, что файл не определяется как существующий в последнем случае.Надеясь, что кто-то сможет помочь.Мой первый пост о переполнении стека, поэтому, пожалуйста, будьте осторожны:).

Существует переменная с именем FileExists типа Boolean, которая изначально имеет значение False.Задача сценария с приведенным ниже кодом является первым шагом в потоке управления, и это устанавливает для переменной значение True / False в зависимости от того, существует ли файл (для которого путь задан в другой переменной FilePath).

<Microsoft.SqlServer.Dts.Tasks.ScriptTask.SSISScriptTaskEntryPointAttribute()> _
<System.CLSCompliantAttribute(False)> _
Partial Public Class ScriptMain
    Inherits Microsoft.SqlServer.Dts.Tasks.ScriptTask.VSTARTScriptObjectModelBase

    Public Sub Main()

        If (File.Exists(CStr(Dts.Variables("FilePath").Value))) Then
            Dts.Variables("FileExists").Value = True
        Else
            Dts.Variables("FileExists").Value = False
        End If
        Dts.TaskResult = ScriptResults.Success
    End Sub

#Region "ScriptResults declaration"

    Enum ScriptResults
        Success = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Success
        Failure = Microsoft.SqlServer.Dts.Runtime.DTSExecResult.Failure
    End Enum

#End Region

End Class

Все работает нормально, когда я запускаю пакет в Visual Studio 2017. Обнаружен файл или нет.Переменная имеет значение true или false соответственно, и процесс служб SSIS следует по соответствующему маршруту.

При развертывании пакета на SQL Server 2016 (тип проекта VS установлен на 2016) и выполнении там переменная всегда возвращаеткак ложьПоскольку переменная первоначально объявлена ​​как ложная, либо она не установлена ​​в ложное значение, либо файл существует, возвращает ложное значение.Ошибки не отмечаются во время выполнения.

Это для запуска на SQL Server 2016. Пакет был создан в VS 2017 с проектом, для которого целевой сервер настроен как 2016 (и, следовательно, версия VB 2015).

Я был убежден, что это должны быть разрешения (для расположения файла или иным образом), но я добавил имя пользователя, выполняющего пакет, к электронным письмам, распространенным позже в потоке управления.Это были мои учетные данные при запуске с VS и с сервера.

Я также подумал, что он взломан, когда понял, что использую VB 2017 на SQL Server 2016, но преобразование проекта для использования SQL 2016 в качестве целевого сервера не решило проблему.

1 Ответ

0 голосов
/ 12 июня 2019

Необходимо дать разрешение учетной записи службы ядра СУБД SQL NT SERVICE\MSSQL$<Instance Name> (где <Instance Name> следует заменить именем установленного экземпляра) :

...