关于跨服务器数据库链接与SQL触发的问题

yanele 2012-09-17 06:05:04
我有三个服务器:

A服务器IP:192.168.0.4

B服务器IP:192.168.0.200

C服务器IP:192.168.120.200

1、现将A服务器作为主服务器,并创建好B与C两个服务器的链接服务器(A、B服务器在同一网段,A、C服务器不在同一网段)

2、需要在A服务器\DB数据库\TB表\写上触发:

1)、A服务器新增时,对应B、C服务器同时新增记录;

2)、A服务器更新时,对应B、C服务器同时删除原数据,再新增记录(由于表字段太多,写更新较麻烦,所以直接删除后插入新记录);

3)、A服务器删除时,对应B、C服务器同时删除记录;

3、假设A、B、C三个服务器的数据库与表名相同;

4、现在写触发遇到的问题:

1)、TB表有一个ID自增字段不好处理——我将B、C服务器的这两个表的ID字段取消自增;

2)、系统不支持 text、ntext 或 image 列——我将FOR INSERT 改成 INSTEAD OF INSERT; FOR UPDATE改成 INSTEAD OF UPDATE; FOR DELETE改成 INSTEAD OF DELETE;

3)、现测试INSTEAD OF INSERT时遇到问题,后面两个触发还没有写,代码如下:

CREATE TRIGGER [dbo].[myINSERT] 
ON [dbo].[TB]
INSTEAD OF INSERT
AS

SET XACT_ABORT ON

BEGIN TRANSACTION

SET NOCOUNT ON;
--插入新增的数据
INSERT INTO B.DB.TB SELECT * FROM INSERTED
INSERT INTO C.DB.TB SELECT * FROM INSERTED

COMMIT TRANSACTION


a、A服务器新增记录时,触发后B服务器数据存在了,但A服务器的数据却丢失了;

b、A服务器新增记录时,无法触发B服务器,提示:
[OLE/DB provider returned message: 新事务不能登记到指定的事务处理器中。 ]
OLE DB 错误跟踪[OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a]。
消息 7391,级别 16,状态 1,过程 myINSERT,第 39 行
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务


关于分布式事务,B、C服务器都是一样的操作,如开启MSDTC服务,135端口,MSDTC设置等,但主要是跨网段的,确实不知道怎么开了,请高手帮我解决一下,谢谢你们了!
...全文
71 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
唐诗三百首 2012-09-17
  • 打赏
  • 举报
回复
既然3台服务器已经搞定2台,再检查检查C服务器漏了什么设定咯,大不了重装系统.
yanele 2012-09-17
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
A服务器新增记录时,触发后B服务器数据存在了,但A服务器的数据却丢失了;
--> 因为是INSTEAD OF触发器,所以应在触发器里加一句
INSERT INTO DB.TB SELECT * FROM INSERTED

关于分布式事务的设定,
参考 http://blog.csdn.net/wufeng4552/article/details/4796846
[/Quote]

分布式事务,我是按照你的方法做的,才使A服务器触发了B触发器,但一样的设置却触发不了C服务器.
唐诗三百首 2012-09-17
  • 打赏
  • 举报
回复
A服务器新增记录时,触发后B服务器数据存在了,但A服务器的数据却丢失了;
--> 因为是INSTEAD OF触发器,所以应在触发器里加一句
INSERT INTO DB.TB SELECT * FROM INSERTED

关于分布式事务的设定,
参考 http://blog.csdn.net/wufeng4552/article/details/4796846

34,576

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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