触发器调用存储过程访问Access链接服务器报错求助
问题原因
触发器执行时会自动纳入SQL Server的事务上下文,而Microsoft.ACE.OLEDB.16.0驱动不支持参与分布式事务(MS DTC)。手动执行存储过程时,操作处于自动提交模式,无显式事务约束,因此可以正常运行;但触发器的事务会尝试让Access链接服务器的操作加入分布式事务,触发驱动不支持事务接口的错误。
解决方法
方法一:修改链接服务器设置,禁用分布式事务提升
- 打开SSMS,展开服务器对象 → 链接服务器,找到
AccessDB链接服务器 - 右键选择属性,切换到服务器选项标签页
- 将「启用分布式事务处理」(Enable Promotion of Distributed Transactions)设置为
False - 确认「RPC Out」选项已设置为
True(确保远程调用正常)
修改后,SQL Server不会尝试将Access的操作提升为分布式事务,触发器调用存储过程即可正常执行。
方法二:异步执行同步逻辑(脱离触发器事务)
如果方法一无效,可以通过SQL Server Agent作业异步执行存储过程,彻底脱离触发器的事务约束:
- 创建SQL Server Agent作业,作业步骤中执行
EXEC [dbo].[SQL_ACCESS_SYNC] - 修改触发器代码,替换直接调用存储过程的语句为启动作业:
作业会独立于触发器事务运行,不受事务上下文限制。EXEC msdb.dbo.sp_start_job @job_name = '你的同步作业名称';
补充说明
确保SQL Server安装了对应位数的Microsoft.ACE.OLEDB.16.0驱动(64位SQL Server需安装64位驱动),手动执行正常说明此条件已满足。
内容的提问来源于stack exchange,提问作者Matt Crumpler
相关产品推荐
相关产品推荐

