为什么 SSIS vb 脚本在 VS 中执行时正确检测到文件存在,而不是从 SQL 服务器执行

Why does SSIS vb script correctly detect file exists when executed in VS but not from SQL Server

我创建的 SSIS 包存在问题,该包最终将检查 excel 文件是否存在,如果不存在则发送电子邮件以指示失败。如果存在,则将数据加载到 table 并删除 excel 文件。这在我在 Visual Studio 中执行包时有效,但在我将其部署到 SQL 服务器时无效。问题是在后一种情况下未检测到文件存在。希望有人能提供帮助。我在 Stack Overflow 上的第一个 post 所以请保持温柔 :).

定义了一个名为 FileExists 的布尔类型变量,该变量最初设置为 False。具有以下代码的脚本任务是控制流中的第一步,它根据文件是否存在(其路径在另一个变量 FilePath 中设置)将变量设置为 True/False。

<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)上部署包并在那里执行时,变量始终返回 false。由于变量最初声明为 false,因此它未设置为 false 或文件存在返回 false。执行期间未标记任何错误。

这是 运行 在 SQL 服务器 2016 上的。包是在 VS 2017 中创建的,项目设置为 2016 年的目标服务器(因此 VB 版本 2015) .

我确信这一定是权限(对文件位置或其他),但我已将执行程序包的用户名附加到稍后在控制流中分发的电子邮件中。这些是我从 VS 和服务器执行时的凭据。

当我意识到我在 SQL Server 2016 上使用 VB 2017 但将项目转换为使用 SQL 2016 作为目标服务器时,我还以为我已经破解了解决问题。

您必须授予 SQL 数据库引擎服务帐户权限 NT SERVICE\MSSQL$<Instance Name> (其中 <Instance Name> 应替换为已安装的实例名称):