SQL Server 2014触发器写入Oracle 10g链接服务器时分布式事务报错求助
解决SQL Server触发器调用Oracle链接服务器的分布式事务报错问题
这个问题我碰到过好多次了——触发器执行时默认会把SQL Server的事务和链接服务器的操作绑定成分布式事务,但哪怕你开了MSDTC,配置不对或者驱动兼容性问题都会导致这个报错。咱们一步步来解决:
1. 先关闭链接服务器的分布式事务提升(最快捷的解决方案)
触发器里的操作默认会触发分布式事务提升,但很多时候Oracle驱动和SQL Server的分布式事务协调会出问题,直接关闭这个提升就能解决:
执行以下SQL语句(替换你的链接服务器名ORCL):
EXEC sp_serveroption 'ORCL', 'remote proc transaction promotion', 'false'
这个设置会让链接服务器的操作作为独立事务执行,不再尝试加入SQL Server的触发器事务里,大部分情况下能直接绕过这个报错。
2. 检查MSDTC的完整配置(不仅仅是开启服务)
如果上面的方法没用,那得确认MSDTC的配置是否完全正确,两台机器都要设置:
- 打开组件服务:控制面板 → 管理工具 → 组件服务
- 展开到「组件服务 → 计算机 → 我的电脑」,右键点击「属性」,切换到「MSDTC」选项卡,点击「安全配置」
- 勾选以下选项:
- 允许网络DTC访问
- 允许远程客户端
- 允许入站
- 允许出站
- 选择「不要求验证」(测试阶段先用这个,后续可以根据安全需求调整)
- 点击确定后,重启MSDTC服务:
net stop msdtc && net start msdtc - 还要确保两台机器的防火墙允许MSDTC通信:可以直接允许「分布式事务协调器」程序通过防火墙,或者开放默认端口135以及MSDTC的动态端口范围。
3. 验证Oracle OLEDB驱动的兼容性
因为你的SQL Server是32位的,必须确保安装的是32位的OraOLEDB.Oracle驱动,并且和Oracle 10g版本兼容:
- 找到Oracle客户端安装路径下的
OraOLEDB.dll(通常在C:\Program Files\Oracle\OraClient10g_home1\bin) - 以管理员身份打开命令提示符,重新注册驱动:
regsvr32 "C:\Program Files\Oracle\OraClient10g_home1\bin\OraOLEDB.dll"
4. 调整触发器里的执行方式
如果上面的方法都不行,可以尝试在触发器里用EXECUTE AT语法来执行插入操作,强制绕开分布式事务:
CREATE TRIGGER TR_CheckOutType ON YourSQLServerTable AFTER INSERT AS BEGIN SET NOCOUNT ON; -- 用EXECUTE AT执行Oracle插入 DECLARE @Col1 INT, @Col2 VARCHAR(50); SELECT @Col1 = Col1, @Col2 = Col2 FROM INSERTED; EXECUTE ('INSERT INTO OracleTargetTable (Col1, Col2) VALUES (?, ?)') AT ORCL, @Col1, @Col2; END
先从步骤1开始试,这个解决了大部分类似的问题,如果不行再逐步排查后面的配置。
内容的提问来源于stack exchange,提问作者Kamran
相关产品推荐
相关产品推荐

