14

我有一个运行脚本任务的 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, 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 代理所在的服务器上运行。我通过在 VS 中将包作为我的帐户和代理的帐户运行来验证这一点,没有任何问题。
  • 代理帐户有权访问相关文件。同样,通过以代理帐户登录服务器进行验证。该文件位于网络共享上,但路径被指定为 UNC 路径。
  • 代理帐户有权访问属于此操作的其他数据库,以排除任何其他潜在的错误来源。
  • 从包商店(通过 SSMS)运行包,因为我的帐户和代理的帐户都有效。我在数据库服务器上这样做以确保。

在我在互联网上看到的其他问题中,这通常是驱动程序的问题。在这种情况下,我不确定它是怎么回事。

我很乐意提供更多信息来帮助其他诊断。我自己完全不确定为什么这不起作用。

4

2 回答 2

6

事实证明,问题在于 Jet 提供程序试图写入 SQL 代理用户的临时目录,即使该任务是在以不同用户身份运行的情况下运行的。这似乎是 Windows 模拟系统的一项功能,它不会更改用户配置文件,只会更改用户令牌。我最终得到了这段代码:

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

这并不理想,但它有效。这意味着我不必授予 SQL 代理的临时目录的权限。只有此代码必须更改。

遗憾的是,似乎无法更改 ODBC 驱动程序放置其临时文件的位置。

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

于 2016-11-08T19:51:34.503 回答
1

我建议尝试几件事:

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

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

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

  4. event viewer如果您有任何与代理帐户或 SQL 代理服务帐户相关的错误,请检查窗口。

  5. 如果您使用 SQL Server 2012 或更高版本部署包,请尝试使用集成服务目录。

于 2016-11-03T19:37:34.593 回答