触发器通过连接服务器更新数据
A,B 2个SQL SERVER 2008数据库,分别在不同的服务器上。当A库的TableA 插入一条数据的时候,将B库中TableB 中对应的记录更新状态。
原计划是写一个服务来定时同步,但用户要的紧,就写了一个触发器+链接服务器来实现。中间碰到一些问题这里做一下总结
模拟数据
create database A go use A go CREATE TABLE TableA ( id int, MapId int ) |
INSERT INTO TableB VALUES (1,0) INSERT INTO TableB VALUES (2,0) INSERT INTO TableB VALUES (3,0) |
实现
exec sp_addlinkedserver 'Server1', '', 'SQLOLEDB', '192.168.50.1'
exec sp_addlinkedsrvlogin 'Server1', 'false', NULL, 'sa', 'mamahao' |
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 |
INSERT INTO tableA VALUES (1,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 |
INSERT INTO tableA VALUES (1, 1)
PRINT '当前事物' + CONVERT(VARCHAR, @@TRANCOUNT) |
而且@@Trancout 在这这个回话中是0值。说明事务都提交了。