关于触发器使用链接服务器的问题处理
来源:互联网 发布:显为人知的外国作家 编辑:程序博客网 时间:2024/05/18 07:48
上一篇 / 下一篇 2009-10-12 10:59:41/ 个人分类:实践
一、 问题现象:
在一个test表上创建触发器如下:
ALTERTRIGGER[TR_test_I]
ON [dbo].[test]
AFTERINSERT,UPDATE
AS
BEGIN
IF EXISTS(SELECT*FROMmyTest.test.DBO.testWHEREMM_SNUMB=RTRIM(@MM_SNUMB))
BEGIN
DELETEFROMmyTest.test.DBO.testWHEREMM_SNUMB=RTRIM(@MM_SNUMB)
END
INSERTINTOmyTest.test.DBO.test SELECT*FROMINSERTED
END
当对表test进行UPDATE操作时出现如下错误:
[OLE/DB provider returned message:新事务不能登记到指定的事务处理器中。]
OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a].
消息7391,级别16,状态1,过程TR_test_I,第26行
The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.
二、 解决方案
根据网上查的资料进行了如下操作:
1. 双方启动MSDTC服务
MSDTC服务提供分布式事务服务,如果要在数据库中使用分布式事务,必须在参与的双方服务器启动MSDTC(Distributed Transaction Coordinator)服务。
2. 在事务开始前加入set XACT_ABORT ON语句
对于大多数OLE DB提供程序(包括SQL Server),必须将隐式或显示事务中的数据修改语句中的XACT_ABORT设置为ON。唯一不需要该选项的情况是在提供程序支持嵌套事务时。
3. MSDTC设置
打开“管理工具――组件服务”,以此打开“组件服务――计算机”,在“我的电脑”上点击右键。在MSDTC选项卡中,点击“安全配置”按钮。在安全配置窗口中做如下设置:
1) 选中“网络DTC访问”
2) 在事务管理通讯中设置时,事务发起服务器选“允许出站“,
事务处理服务器选”允许入站”,都选择”不要求进行验证”
3) 选中启用XA事务
4) 保证DTC登陆账户为:NT Authority/NetworkService
4. 确定后自动重启MSDTC服务
5. 重新执行对test表的UPDATE操作,执行成功。
三、 进一步实验
上面的方法是通过“SQLOLEDB“,创建链接服务器来进行的。
之后,我有尝试使用ODBC创建链接服务器进行测试时也是经过了一番波折。
1. 创建链接服务器:
EXEC sp_addlinkedserver'mytest','','MSDASQL','test'
GO
EXECsp_addlinkedsrvlogin ' myte',false,'sa','sa'
GO
2. 建立用户DSN
3. 执行对test表的UPDATE操作时,产生如下错误:
[OLE/DB provider returned message: [Microsoft][ODBC驱动程序管理器]未发现数据源名称并且未指定默认驱动程序]
OLE DB error trace [OLE/DB Provider 'MSDASQL' IDBInitialize::Initialize returned 0x80004005: ].
消息7399,级别16,状态1,过程TR_MOLD_MASTER_I,第26行
OLE DB provider 'MSDASQL' reported an error.
4. 经过多次调整链接参数后仍无法解决,无奈之下只好删除该DSN,创建了一个与之同样设置的系统DSN,进行测试时,经过一个较为漫长的等待后竟然成功了(真是太让人惊讶了)
注:与用户DSN不同的是系统DSN允许所有登录服务器的用户使用。
四、 总结:
经过一番折腾,触发器终于如愿正常使用了。通过比较网上针对此类问题的其它说明,我个人认为其中的部分内容并非引起该问题的原因,在设置时是可有可无的。
1.开始时填写的BEGIN DISTRIBUTED TRANSACTION、COMMIT TRANS
2.MSDTC设置时的客户端和远程访问,事务管理通讯中的允许入站或出站(虽然自己没有尝试了解进一步的原因,但个人认为不了解的东西使用的越少越好)
3.链接服务器远侧域名解析,135端口等,在MSDTC服务启用的情况下,此类问题都可以不去考虑
但是,其中的有些细节是必须注意的,如:
SET ON改为OFF时,会产生如下错误:
[OLE/DB provider returned message:无法在此会话中启动更多的事务。]
OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionLocal::StartTransaction returned 0x8004d013: ISOLEVEL=4096].
消息7395,级别16,状态2,过程TR_MOLD_MASTER_I,第28行
Unable to start a nested transaction for OLE DB provider 'SQLOLEDB'. A nested transaction was required because the XACT_ABORT option was set to OFF.
缺少该语句时,也会产生同样的错误。
不管如何,上面的内容只是自己在现有的环境下测试得出的结果,并不保证其它的环境同样适用。希望能给大家帮助。
最后添加一个微软的DTC测试工具http://space.itpub.net/?uid-672726-action-viewspace-itemid-616306
- 关于触发器使用链接服务器的问题处理
- 关于sqlserver2000的链接服务器功能的使用问题
- 关于触发器的问题?
- 触发器 同步链接服务器的 另一种解决办法
- SQL Server:在触发器中对远程链接服务器进行更新操作的问题
- 关于服务器处理跨域的问题
- 关于MySQL 触发器的使用
- 关于触发器要弄清楚的问题(着重后触发器)
- 触发器方面的链接
- 关于触发器死循环的问题
- 关于C++使用opencv链接库无法调用的问题
- 关于angularjs中使用路由后子锚点的链接跳转问题
- 关于批量插入时触发器的使用
- 关于触发器问题
- 几个关于Windows2003域服务器的链接
- 关于Sql Server2005链接服务器的添加
- 触发器器中执行链接服务器
- 在触发器中访问链接服务器
- JS 钟表
- VC使用ADO操作数据库的方法 转
- Linux Redhat4.0下安装 Oracle10.2.0.1
- webgl教程韩语版(第三课)
- Java Web从入门到精通 谁买谁后悔
- 关于触发器使用链接服务器的问题处理
- 修改JBOSS日志级别
- 子网ip计算
- 一种求和的创新思维的应用2(变形)
- ubuntu pdf 乱码 ,终于明白了原理
- windows定位dll的搜索顺序
- C# split 使用方法
- 导向恶意网站的搜索引擎搜索结果
- Three.js API文档