触发器的一个问题

wjx_0_2001 2011-11-01 10:43:37
想做一个触发器,用来同步数据。

环境如下:

A机器:win2003 B机器:win2003 数据库都是SQL SERVER 2000企业版

系统版本都是SP2


(附注:我在一台机器上做得)192.168.1.38是我机器上的IP
-----------------------------------------------------------------
我已经建立了连接服务器,通过查询分析器的查询,是没有问题的。并且能够通过

这里连接服务器 ,是能够访问数据的。

-----------------------------------
连接服务器的名称:TESTSrv
exec sp_addlinkedserver TESTSrv,'ms','SQLOLEDB','192.168.1.38'
exec sp_addlinkedsrvlogin TESTSrv,'false',NULL,'sa','123'


然后,我通过查询分析器,在数据库A上增加一条记录,但出现以下错误:
--------------------------------------------------------
服务器: 消息 7391,级别 16,状态 1,过程 InRole,行 16
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。

------------------------------------------------------------
触发器脚本:
CREATE TRIGGER [InData] ON [dbo].[myHIT]
AFTER INSERT
AS

BEGIN
--set xact_abort on
---BEGIN DISTRIBUTED TRANSACTION
--以上两句,加不加,一样的现象

DECLARE @rid INT
DECLARE @rname VARCHAR(50)

SET @rid=-1
SET @rname=''

SELECT @rid = inserted.tID , @rname = inserted.tName FROM inserted

INSERT INTO TESTSrv.myDB.dbo.t1(id,name) SELECT inserted.tID , inserted.tName FROM inserted

END




...全文
91 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
康斯坦汀 2011-11-08
  • 打赏
  • 举报
回复
一般建议触发器普通情况下不要用。关于性能,我可以告诉你即使是每秒处理过万笔业务,
大数据量并发的银行交易或者在线大型网站,都没有使用触发器。触发器不是解决性能问题的途径。
wjx_0_2001 2011-11-07
  • 打赏
  • 举报
回复
这个问题 还真的无人能解了。。。

看来 分布式 很难。。。


很多书上,讲得太肤浅。。


wjx_0_2001 2011-11-02
  • 打赏
  • 举报
回复
网上溜一大圈,看来这个问题

无人能知

无人能解




wjx_0_2001 2011-11-02
  • 打赏
  • 举报
回复
1、存储过程效率 没触发器 高啊

2、,“用存储过程+事务”,

问题是,我用触发器,也出现新事务不能登记到指定的事务处理器中,

已经在“事务”这块出现难题了,所以 用存储过程,更不行了。

3、虽然可以用程序来调用存储过程,但速度慢。。。



wjx_0_2001 2011-11-02
  • 打赏
  • 举报
回复
具体点 啊
sdl2005lyx 2011-11-02
  • 打赏
  • 举报
回复
“想做一个触发器,用来同步数据。”,
用存储过程+事务,可能容易实现你的需求。。。
康斯坦汀 2011-11-01
  • 打赏
  • 举报
回复
自觉抵制从来不用触发器的路过。
wjx_0_2001 2011-11-01
  • 打赏
  • 举报
回复
另外其他的工作都做了

我网上也找过。。


所以启动DTC。启动了,所以请不要再让我启动DTC了。

配置相关的DTC,这个网上一堆。


给点建设性的建议。

多谢

还有:这样做没问题

select * from TESTSrv.myDB.dbo.t1

为什么这样行????

然后,我通过查询分析器,在数据库A上增加一条记录,但出现以下错误:
--------------------------------------------------------
服务器: 消息 7391,级别 16,状态 1,过程 InRole,行 16
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。



该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。

SQLOLEDB 没法提供启动分布式事务???


那还有哪里没有设置?


难道是我得win2003的系统要打补丁?


4,017

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 数据库
社区管理员
  • 数据库
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧