1、假定我有两台服务器,本地服务器为server1,远程链接服务器server2。
2、本地和远程的数据表结构都相同,如下:
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[test]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[test]
GO
CREATE TABLE [dbo].[test] (
[a] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[b] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL ,
[c] [nvarchar] (50) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
3、建立链接服务器
if exists(select 1 from master..sysservers where srvname='srv_lnk')
exec sp_dropserver 'srv_lnk','droplogins'
go
exec sp_addlinkedserver 'srv_lnk','','SQLOLEDB','server2'
/* srv_lnk:链接服务器名称,server2:远程服务器 */
exec sp_addlinkedsrvlogin 'srv_lnk','false',null,'sa','sa'
/* srv_lnk:链接服务器名称,sa:登陆远程账号,sa:登陆远程密码 */
go
4、在本地服务器Server1的表test上创建触发器,如下所示:
CREATE TRIGGER t_test ON [dbo].[test]
FOR INSERT
AS
insert into srv_lnk.pubs.dbo.test
select * from inserted
--srv_lnk:创建的链接服务器
go
5、在SQL查询分析器内的测试语句:
insert into test values('a','b','c')
6、错误描述:
服务器: 消息 7391,级别 16,状态 1,过程 t_test,行 4
该操作未能执行,因为 OLE DB 提供程序 'SQLOLEDB' 无法启动分布式事务。
[OLE/DB provider returned message: New transaction cannot enlist in the specified transaction coordinator. ]
7、故障诊断:
1> 连接服务器配置正常,以select * from srv_lnk.pubs.dbo.test在查询分析器内测试,有正确信息返回。
2> 服务内Distributed Transaction Coordinator已启动。
3> SQL Server的MS DTC也正常启动。