SQLS分布式问题记录

SQLServer分布式问题记录

    • 1.问题描述
    • 2.错误分析
    • 参考链接

1.问题描述

USE [trtfms]
GO
/****** Object:  Trigger [dbo].[tr_check_accept_note_update]    Script Date: 09/28/2018 13:06:53 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER TRIGGER [dbo].[tr_check_accept_note_update]
   ON  [dbo].[t_check_accept_note]
   AFTER update
AS 
BEGIN
	--item
	declare @medc_id int,@batch_no varchar(50),@quantity int,@produce_time varchar(20),@end_time varchar(20)
	--form
	declare @form_id int,@number varchar(20),@Suply_id int,@status_old varchar(10),@status_new varchar(10)
	--medc
	declare @medc_no varchar(20)
	--Suply
	declare @Suply_no varchar(20)

	select @form_id = id,
		   @number = number,
		   @Suply_id = qualifiedSupplier_id,
		   @status_new = review_status
	from inserted
	select @status_old = review_status
	from deleted
	
	select @Suply_no = customer_number from t_qualifiedSupplier where id = @Suply_id
	
	if @status_old <> '3' and @status_new = '3'
	begin
		declare cu_xsd cursor for select qualified_medicine_id,batch_production,quantity,produce_time,end_time from t_checkaccept_item where receiving_id = @form_id
		--
		open cu_xsd 
		FETCH NEXT FROM cu_xsd into @medc_id,@batch_no,@quantity,@produce_time,@end_time
		While @@FETCH_STATUS=0
		Begin
			declare @dp_id varchar(255)= '',@works varchar(255)=''
			select @medc_no = medc_no,@dp_id=dp_id from t_qualified_medicine where id = @medc_id
			
			if @dp_id = '2001'
			begin
				select @works = 'XP2'
			end
			else
			begin
				select @works = 'SSP'
			END
		
			--入库下发表
			--LINK_62指的是链接服务器192.168.0.62服务器,可以用OPENDATASOURCE ('SQLOLEDB', 'Data Source=192.168.0.62;User ID=sa;Password=trtsales' )代替
			insert into LINK_62.fms_wms_food.dbo.fms_in_task(Bilno,Supply,Store,Matno,Batch,Statu,Quant,Makdat,Vddat,Mvtyp,Senddat,Sflag,Itmno,works)
			values(@number,@Suply_no,'004',@medc_no,@batch_no,'A',@quantity,@produce_time,@end_time,'521',getdate(),'0','1',@works)
			--抄送表
			insert into LINK_62.fms_wms_food.dbo.fms_in_task_send(Bilno,Supply,Store,Matno,Batch,Statu,Quant,Makdat,Vddat,Mvtyp,Senddat,Sflag,Itmno,works)
			values(@number,@Suply_no,'004',@medc_no,@batch_no,'A',@quantity,@produce_time,@end_time,'521',getdate(),'0','1',@works)
			
			FETCH NEXT FROM cu_xsd into @medc_id,@batch_no,@quantity,@produce_time,@end_time
		end	
		CLOSE cu_xsd
		DEALLOCATE cu_xsd
	end
END

上面是完整的触发器代码,要实现一个服务器A新增一条数据的同时插到服务器B上的一个表中,在Web界面保存时,一直保存不上,后台报错如下:

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: 无法执行该操作,因为
链接服务器 "(null)" 的 OLE DB 访问接口 "SQLNCLI10" 无法启动分布式事务。

2.错误分析

由于服务重装了系统,猜测可能是数据库配置出了问题,于是在服务器A创建了服务器B的链接服务器,创建代码如下:

EXEC  sp_addlinkedserver
@server='LINK_62',   --链接服务器别名
@srvproduct='',
@provider='SQLOLEDB',
@datasrc='192.168.0.62'  --要访问的的数据库所在的服务器的ip
GO
EXEC sp_addlinkedsrvlogin
'LINK_62',                  --链接服务器别名
'false', 
 NULL,
'sa',                     --要访问的数据库的用户              
'trtsales'                    --要访问的数据库,用户的密码
GO

未解决问题,根据下面的《SQL Server 分布式数据库的问题和解决方法1》

参考链接

SQL Server 分布式数据库的问题和解决方法1 - CSDN博客
https://blog.csdn.net/xys_777/article/details/5729339

SQL Server 分布式数据库的问题和解决方法2 - CSDN博客
https://blog.csdn.net/xys_777/article/details/5729334

你可能感兴趣的:(个人总结)