加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 16:28:59 所属栏目:MsSql教程 来源:网络整理
导读:我有一个运行脚本任务的SSIS包(主要是等等).该脚本任务使用OleDB连接连接到Access数据库.这是Microsoft Jet 4.0连接.我安装了驱动程序但它不会通过代理帐户在SQL代理中运行.它将直接从Visual Studio和包存储运行良好.事实上,当我作为代理绑定的特殊帐户登录时
我有一个运行脚本任务的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 = "PathToFile";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临时目录的访问权限.如果我也可以想出一个解决方法,我会发布.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读