sql-server – 使用SSIS包到Access DB的SQL代理作业失败

我有一个运行脚本任务的SSIS包(主要是等等).该脚本任务使用OleDB连接连接到Access数据库.这是Microsoft Jet 4.0连接.我安装了驱动程序但它不会通过代理帐户在sql代理中运行.它将直接从Visual Studio和包存储运行良好.事实上,当我作为代理绑定的特殊帐户登录时,这两个地方都可以正常运行.但是当我通过sql Server代理运行时,我得到了可怕的“未指定的错误”OleDbException.

脚本任务的相关代码

// 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 = "\Path\To\File";Provider=Microsoft.Jet.OLEDB.4.0"
using(access = new OleDbConnection(string.Format(accessConnectionStringTemplate,file.FileName))) {
     access.open();
     // other code
}

通过sql代理作业历史记录的错误消息:

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,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,DbConnectionoptions userOptions)
   at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection,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临时目录的访问权限.如果我也可以想出一个解决方法,我会发布.

相关文章

SELECT a.*,b.dp_name,c.pa_name,fm_name=(CASE WHEN a.fm_n...
if not exists(select name from syscolumns where name=&am...
select a.*,pano=a.pa_no,b.pa_name,f.dp_name,e.fw_state_n...
要在 SQL Server 2019 中设置定时自动重启,可以使用 Window...
您收到的错误消息表明数据库 'EastRiver' 的...
首先我需要查询出需要使用SQL Server Profiler跟踪的数据库标...