使用SSIS包访问数据库的SQL Agent作业失败



我有一个运行脚本任务的SSIS包(大多数情况下,还有一些其他的东西)。脚本任务通过OleDB连接连接到Access数据库。这是Microsoft Jet 4.0连接。我已经安装了驱动程序。但它不会通过代理帐户在SQL代理中运行。它可以直接从Visual Studio和包存储中运行。事实上,当我以代理绑定的特殊帐户登录时,它在这两个地方都运行良好。但是当我通过SQL Server代理运行时,我得到了可怕的"未指定错误"oledbeexception。

脚本任务的相关代码:

// class field
private string accessConnectionStringTemplate = "Data Source="{0}";Provider=Microsoft.Jet.OLEDB.4.0;";
// in method that connects to database
Print(file, "Connection string: " + string.Format(accessConnectionStringTemplate, file.FileName));
// outputs: Data Source = "PathToFile";Provider=Microsoft.Jet.OLEDB.4.0"
using(access = new OleDbConnection(string.Format(accessConnectionStringTemplate, file.FileName))) {
     access.Open();
     // other code
}

通过SQL Agent作业历史记录的错误消息:

Started:  12:35:10 PM
Error: 2016-11-03 12:35:33.51
   Code: 0x00000000
   Source: Import Files Main
   Description: Exception: Unspecified error
End Error
Error: 2016-11-03 12:35:33.51
   Code: 0x00000000
   Source: Import Files Main
   Description:    at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
   at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
   at System.Data.ProviderBase.DbConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreateNonPooledConnection(DbConnection owningConnection, DbConnectionPoolGroup poolGroup, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionInternal.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
   at System.Data.OleDb.OleDbConnection.Open()
   at ST_cc0028a4b56242909c2eae546a807995.csproj.ScriptMain.ImportFile(AccessFile file, DateTime startRecordDate, DateTime endRecordDate, List`1 accessTables, Boolean includeTransactionTables, List`1 specifiedTableList)
   at ST_cc0028a4b56242909c2eae546a807995.csproj.ScriptMain.Main()
End Error
Error: 2016-11-03 12:35:33.51
   Code: 0x00000006
   Source: Import Files 
   Description: The script returned a failure result.
End Error

一些我已经确定的事情:

  • Access驱动程序已安装并在SQL Agent所在的服务器上工作。我通过在VS中以我的帐户和代理的帐户运行包来验证这一点,没有问题。
  • 代理帐户有权访问相关文件。同样,通过作为代理帐户登录到服务器进行验证。文件在网络共享中,但路径指定为UNC路径。
  • 代理帐户可以访问作为此操作一部分的其他数据库,以排除任何其他潜在的错误来源。
  • 从包存储(通过SSMS)运行包,因为我的帐户和代理的帐户都有效。我在数据库服务器上这样做以确保。

在我在网上看到的其他问题中,这通常是司机的问题。在这种情况下,我不确定这是怎么回事。

我很高兴提供额外的信息,以帮助其他诊断。我自己完全不确定为什么这不起作用。

问题是Jet提供程序试图写入SQL Agent用户的临时目录,即使任务是以不同用户的模拟方式运行的。这似乎是Windows模拟系统的一个特性,它不会更改用户配置文件,只会更改用户令牌。我最终得到了这样的代码:

var tempPath = Path.GetTempPath().Replace("\SQLSERVERAGENT\", "\" + Environment.UserName + "\");
Environment.SetEnvironmentVariable("TEMP", tempPath);
Environment.SetEnvironmentVariable("TMP", tempPath);

这不是理想的,但它有效。这意味着我不必为SQL Agent的临时目录授予权限。只有这段代码需要修改。

遗憾的是,似乎没有办法改变ODBC驱动程序放置临时文件的位置。

编辑:我在使用Excel源的基于常规数据流的软件包时也遇到了这个问题。在这种情况下,我别无选择,只能授权代理用户帐户访问SQL Agent的临时目录。如果我也能想出一个解决办法,我会发布的。

我建议你做几件事:

  1. 尝试用cmd模式执行您的包,即使用SQL代理的dtexce.exe语法(使用32位和64位选项)。

  2. 添加业务帐号(SQL Agent正在运行的帐号)到DCOM component for Integration Service。如果允许,请将SQL代理服务帐户更改为代理帐户(用于测试)。

  3. 使用代理帐户执行所有操作,即使用代理帐户部署包并使作业所有者为代理帐户(在SQL代理中)。使用Proxy Account创建作业

  4. 检查窗口event viewer是否有任何与代理帐户或SQL代理服务帐户相关的错误。

  5. 如果您使用SQL Server 2012或更高版本部署包,请尝试使用Integration Services Catalog。

最新更新