触发器双向同步时的疑问!!!(即客户端和服务器数据要实时同步),100分开始散分了
问题描述:
1.以下代码能够利用链接服务器,实现客户端访问服务器,且是正常的
2.在客户端上增加了三个触发器,即增删改,实现了客户端增删改的同时,服务器中的相关表也正常增删改。
3.但用同样的方法,在服务器上建立了链接服务器后,在服务器上建立触发器时,提示这样的错误:
服务器: 消息 7399,级别 16,状态 1,过程 tr_insert_testClient,行 5
OLE DB 提供程序 'MSDASQL' 报错。
[OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server]分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。]
[OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server]该操作未能执行,因为 OLE DB 提供程序 'MSDASQL' 无法启动分布式事务。]
[OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server]OLE DB 错误跟踪[OLE/DB Provider 'MSDASQL' ITransactionJoin::JoinTransaction returned 0x8004d00a]。]
[OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server][OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server]其它会话正在使用事务的上下文。]]
OLE DB 错误跟踪[OLE/DB Provider 'MSDASQL' IRowsetChange::InsertRow returned 0x80004005: ]。
详细代码如下:
客户端详细测试:
--客户端和服务器端表分别为testClient,testServer,表结构一样,如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[testClient]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[testClient]
GO
CREATE TABLE [dbo].[testClient] (
[id] [int] NOT NULL ,
[email] [varchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
--测试远程链接服务器
EXEC sp_addlinkedserver
'xiaowang',
'',
'MSDASQL',
NULL,
NULL,
'DRIVER={SQL Server};SERVER=xiaowang;UID=sa;PWD=sa;'
go
EXEC sp_addlinkedsrvlogin @rmtsrvname='xiaowang',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='sa'
--测试分布式事务
--客户端和服务器端同时开启分布式事务处理服务,开启方法为:
--我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动
--go
set XACT_ABORT on
set ANSI_NULL_DFLT_ON on
set ANSI_WARNINGS on
BEGIN DISTRIBUTED TRANSACTION
select * from xiaowang.pubs.dbo.testServer
commit tran
--用触发器测试同步流程
--1。客户端上触发器
--新增同步
create trigger tr_insert_testClient on testClient
for insert
as
set xact_abort on
insert xiaowang.pubs.dbo.testServer(id,email)
select id,email from inserted
go
--测试插入触发器
insert into testClient(id,email) values('21','dfdsf')
--查看触发器状态
EXEC sp_helptrigger testClient
--删除同步
create trigger tr_delete_testClient on testClient
for delete
as
set xact_abort on
delete b
from xiaowang.pubs.dbo.testServer b,deleted d
where b.id=d.id
go
--修改同步
create trigger tr_update_testClient on testClient
for update
as
set xact_abort on
update a set id=b.id,email=b.email
from xiaowang.pubs.dbo.testServer a,inserted b
where a.id=b.id
go
--上面可以实现从客户端到服务器的同步,测试全部正常
--但在服务器上进行以上类似的操作时,却提示错误,在服务器上操作如下:
EXEC sp_addlinkedserver
'mfmdl',
'',
'MSDASQL',
NULL,
NULL,
'DRIVER={SQL Server};SERVER=mfmdl;UID=sa;PWD=sa;'
go
EXEC sp_addlinkedsrvlogin @rmtsrvname='mfmdl',@useself='false',@locallogin='sa',@rmtuser='sa',@rmtpassword='sa'
--此时是正常的
select * from mfmdl.pubs.dbo.testClient
--在服务器端创建触发器
create trigger tr_insert_testServer on testServer
for insert
as
set xact_abort on
insert mfmdl.pubs.dbo.testClient(id,email)
select id,email from inserted
go
--此时随便插入一条语句时,报错
insert into testServer(id,email) values('3454','dfsdf')
/*
服务器: 消息 7399,级别 16,状态 1,过程 tr_insert_testClient,行 5
OLE DB 提供程序 'MSDASQL' 报错。
[OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server]分布式事务已完成。请将此会话登记到新事务或 NULL 事务中。]
[OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server]该操作未能执行,因为 OLE DB 提供程序 'MSDASQL' 无法启动分布式事务。]
[OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server]OLE DB 错误跟踪[OLE/DB Provider 'MSDASQL' ITransactionJoin::JoinTransaction returned 0x8004d00a]。]
[OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server][OLE/DB provider returned message: [Microsoft][ODBC SQL Server Driver][SQL Server]其它会话正在使用事务的上下文。]]
OLE DB 错误跟踪[OLE/DB Provider 'MSDASQL' IRowsetChange::InsertRow returned 0x80004005: ]。
*/
环境测试:xp+sql2000(sp4),两机环境一样。
急盼哪位兄弟能指点一下,分不够再加!!!!!!上面的环境可直接拷贝测试