在连接到 ms-access 数据库时通过 SQL 作业 运行 时出现 SSIS 错误(意外终止)

SSIS error when run via SQL job while connecting to ms-access database (Unexpected Termination)

我有一个 OLEDB 任务连接到本地文件系统上的 ms-access 数据库并将数据转储到 sql 数据库中。

访问数据库连接字符串是:Data Source=\my-share\accessdbfile.accdb;Provider=Microsoft.ACE.OLEDB.16.0;

SSIS 包 运行 在 visual studio 中正常。此计算机上安装了 Access 2016 32 位运行时间。

部署到SSIS目录后,右击执行就OK了。此计算机上安装了 Access 2016 64 位 运行时间。

当此包通过 SQL 代理作业计划到 运行 时,使用 proxy/credential [域用户 - 示例:domainname\user1](对访问具有读取权限db 文件),则作业失败。 SSIS 执行报告显示错误为:意外终止。没有进一步的信息。

假设如果我将代理凭据 (domainname\user1) 添加到本地管理员组(在计算机管理中),那么 SQL 作业 运行 就可以了。有什么解决方案可以让我只提供所需的最低权限?

仅凭提供的信息很难调试,但总的来说:

用户 运行 该作业至少需要对 Access 数据库所在的基础文件夹具有写入和删除权限。这是为数据库生成锁定文件所必需的。

如果这是不可取的,因为作业可能会被恶意用户修改,我见过这样的部署:在具有写访问权限和大小配额的临时文件夹中制作副本,并尽快删除该临时文件夹作业完成时,无论作业是否成功。

错误很难调试,因为在 运行通过 visual studio 连接时不会发生错误。即使从 SSIS 目录部署到 SQL 服务器和 运行,执行也正常。只有当包是 运行 通过 SQL 服务器代理作业(通过 credential/proxy)时才会发生错误 - SSIS 执行报告不显示任何有用的消息;令人惊讶的是,当将凭据添加为计算机上的本地管理员时,错误得到解决 - 这是一种不好的做法。

解决方案 是分析您使用的是哪种 ms 访问文件,并适当使用正确的访问 运行时间版本(2013 vs 2016)和正确的提供程序连接字符串中的值。

访问运行时间:

就我而言,我卸载了 Access 2016 64 位 运行time 并安装了 Access 2013 64 位 运行time。

提供商版本:

我把provider版本从16.0改成了15.0,如下图-

之前:Data Source=\my-share\accessdbfile.accdb;Provider=Microsoft.ACE.OLEDB.16.0;

之后:Data Source=\my-share\accessdbfile.accdb;Provider=Microsoft.ACE.OLEDB.15.0;

注:

  1. 不需要将用户添加到本地管理员组。

  2. 无需使用该帐户登录计算机。

  3. 只有读取权限(在 windows 文件夹安全下)就足够了,假设 SSIS 包将只读取 ms 访问数据库。