我有一个 OLEDB 任务,它连接到本地文件系统上的 ms-access 数据库并将数据转储到 sql 数据库中。
访问数据库连接字符串为:Data Source=\\my-share\accessdbfile.accdb;Provider=Microsoft.ACE.OLEDB.16.0;
SSIS 包在 Visual Studio 中运行正常。此计算机上安装了 Access 2016 32 位运行时。
部署到 SSIS 目录后,右键单击并执行工作确定。此计算机上安装了 Access 2016 64 位运行时。
当此程序包计划通过 SQL 代理作业运行时,使用代理/凭据 [域用户 - 示例:域名\用户 1](对访问 db 文件具有读取权限),则作业将失败。 SSIS 执行报告将错误显示为:意外终止。没有进一步的信息。
假设如果我将代理凭据(域名\用户 1)添加到本地管理员组(在计算机管理中),那么 SQL 作业运行正常。有什么办法可以解决这个问题,以便我只能提供所需的最低权限?
答案 0 :(得分:0)
仅使用提供的信息很难对此进行调试,但总的来说:
运行该作业的用户至少需要对 Access 数据库所在的基础文件夹具有写入和删除权限。这是为数据库生成锁文件所必需的。
如果这是不受欢迎的,因为作业可能会被恶意用户修改,我已经看到这样的部署,其中在具有写访问权限和大小配额的临时文件夹中制作副本,并且该临时文件夹在作业完成,无论作业是否成功。
答案 1 :(得分:0)
该错误很难调试,因为它在通过 Visual Studio 运行时不会发生。即使部署到 SQL 服务器并从 SSIS 目录运行,执行也能正常工作。仅当包通过 SQL 服务器代理作业(通过凭据/代理)运行时才会发生错误 - SSIS 执行报告不显示任何有用的消息;令人惊讶的是,当将凭据添加为计算机上的本地管理员时,错误得到了解决 - 这是一种不好的做法。
解决方案是分析您使用的是哪种 ms 访问文件,并适当地使用正确的访问运行时版本(2013 年与 2016 年)和连接字符串中正确的提供程序值。
访问运行时:
就我而言,我卸载了 Access 2016 64 位运行时并安装了 Access 2013 64 位运行时。
提供程序版本:
我把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;
注意:
无需将用户添加到本地管理员组。
无需使用该帐户登录计算机。
假设 SSIS 包仅读取 ms access 数据库,则仅读取权限(在 Windows 文件夹安全性下)就足够了。