触发器通过连接服务器更新数据

触发器通过连接服务器更新数据

最近碰到一个需求

A,B 2SQL SERVER 2008数据库,分别在不的服务器上。当A库的TableA 插入一条数据的时候,将B库中TableB 中对应的记录更新状态。

原计划是写一个服务来定时同步,但用户要的紧,就写了一个触发器+链接服务器来实现。中间碰到一些问题这里做一下总结

 模拟数据

create database A

go

use A

go

CREATE TABLE TableA

(

    id int,

    MapId int

)

实现

  1. 给在1号服务器上建立链接服务器,链接到2号服务器

exec sp_addlinkedserver 'Server1', '', 'SQLOLEDB', '192.168.50.1'

 

exec sp_addlinkedsrvlogin 'Server1', 'false', NULL, 'sa', 'mamahao'

  1. 给1号服务器的A库下的TableA 增加触发器

CREATE TRIGGER tg_insert_TableA

ON tableA

AFTER INSERT

AS

BEGIN

DECLARE @MAPId INT

 

SELECT @MAPId = MapID

FROM INSERTED

 

UPDATE SERVER1.B.dbo.TableB

SET STATE = 1

WHERE MAPID = @MAPId

END

 

  1. 测试,给TableA 插入数据

INSERT INTO tableA

VALUES (1,1)

但是1号服务器报错

分析

  1. UPDATE SERVER1.B.dbo.TABLEB SET STATE=100 WHERE MAPID = 2

    是没有问题,可见分布式服务都正常。

  2. 只要带上了 BEGIN TRAN …COMMIT 就报错

  3. 也不行。

  4. A服务器的INSERT 一定要成功,B服务器的更新偶尔失败没关系。

解决

  1. 于是对触发器做出如下修改

 

ALTER TRIGGER tg_insert_TableA

ON tableA

AFTER INSERT

AS

BEGIN

DECLARE @MAPId INT

 

SELECT @MAPId = MapID

FROM INSERTED

 

COMMIT

 

UPDATE SERVER1.B.dbo.TableB

SET STATE = 1

WHERE MAPID = @MAPId

 

BEGIN TRAN

END

 

  1. 测试验证

INSERT INTO tableA

VALUES (1,

1)

 

PRINT '当前事物' + CONVERT(VARCHAR, @@TRANCOUNT)

 

发现执行成功。

        而且@@Trancout 在这这个回话中是0值。说明事务都提交了。

反思

原文地址:https://www.cnblogs.com/songr/p/4129006.html