Sql資料庫利用linkserver和 CT[CHANGE_TRACKING]實現釋出訂閱

我的地盘,我做主發表於2024-06-06

源伺服器

初始化同步資料表

SELECT * INTO 【用於同步資料的表名】
FROM (
SELECT top 0
CT.SYS_CHANGE_VERSION,
CT.SYS_CHANGE_OPERATION,
CT.【同步資料表的主鍵ID】
FROM CHANGETABLE(CHANGES 源資料表名, 0) AS CT ) t


建立獲取同步資料儲存過程

TRUNCATE TABLE 【用於同步資料的表名】

INSERT INTO 【用於同步資料的表名】
(SYS_CHANGE_VERSION,SYS_CHANGE_OPERATION,【同步資料表的主鍵ID】)

SELECT
CT.SYS_CHANGE_VERSION,
CT.SYS_CHANGE_OPERATION,
CT.【同步資料表的主鍵ID】
FROM CHANGETABLE(CHANGES dbo.源資料表名, @last_sync_version) AS CT

訂閱伺服器

同步作業
建立同步記錄表SyncTable

DECLARE @currentVersion BIGINT,@maxVersion bigInt
DECLARE @tableName nvarchar(100)
SET @tableName=''同步表名''
SELECT @currentVersion=SyncVersion FROM [dbo].[SyncTable] WHERE @tableName=tableName AND IsInitOver=1
---判斷是否已經初始化完成
IF @currentVersion IS NOT null
BEGIN
EXEC xiaoben.SchoolBasic.dbo.[GetSyncData2] ''同步表名'',@currentVersion【最新版本】
DECLARE @insertCount INT,@updateCount INT,@deleteCount INT,@ChangeCount INT
SELECT @ChangeCount=COUNT(1),
@insertCount=ISNULL(SUM(CASE WHEN SYS_CHANGE_OPERATION=''I'' THEN 1 ELSE 0 end),0),
@deleteCount=ISNULL(SUM(CASE WHEN SYS_CHANGE_OPERATION=''D'' THEN 1 ELSE 0 end),0),
@updateCount=ISNULL(SUM(CASE WHEN SYS_CHANGE_OPERATION=''U'' THEN 1 ELSE 0 end),0)
FROM xiaoben.SchoolBasic.dbo.sync_tempSCHB_Account_UserInfo2
---開始批次插入
IF (@ChangeCount>0)
BEGIN

IF (@insertCount>0)
BEGIN
PRINT ''開始新增''
SET IDENTITY_INSERT [表名] ON

---新增先刪除目標庫存在的ID資料
INSERT INTO [dbo].[表名]
(【列名】
)
SELECT
t1.[列名]

FROM 【linkserver的名稱】.[資料庫的名稱].dbo.[同步資料檢視] t1
WHERE t1.SYS_CHANGE_OPERATION=''I'' AND NOT EXISTS (SELECT [UserInfoID] FROM [dbo].[SCHB_Account_UserInfo] ttt WHERE ttt.[UserInfoID]=t1.[UserInfoID])

SET IDENTITY_INSERT [表名] OFF

END

IF @updateCount>0
BEGIN
---開始批次修改
PRINT ''開始修改''

UPDATE [表名] SET
[列名]=t.[列名]
,[列名]=t.[列名]

FROM (
select
t1.[列名]
,t1.[列名]

FROM 【linkserver的名稱】.[資料庫的名稱].dbo.[同步資料檢視] t1
WHERE t1.SYS_CHANGE_OPERATION=''U'') t where t.[表主鍵]=[表名].[表主鍵]
END

IF @deleteCount>0
BEGIN
---開始批次刪除
PRINT ''開始刪除''
DELETE FROM [表名] WHERE 【表主鍵】 IN(
SELECT 表主鍵 FROM 【linkserver的名稱】.[資料庫的名稱].dbo.[同步資料檢視] WHERE SYS_CHANGE_OPERATION=''D''
)
END

INSERT INTO [dbo].[TableChangeLog]
([TableName]
,[SYS_CHANGE_VERSION]
,[SYS_CHANGE_OPERATION]
,[ID])
select
''表名''
,[SYS_CHANGE_VERSION]
,[SYS_CHANGE_OPERATION]
,[表主鍵] from 【linkserver的名稱】.[資料庫的名稱].dbo.[同步資料檢視]

SELECT @currentVersion=MAX(SYS_CHANGE_VERSION) FROM 【linkserver的名稱】.[資料庫的名稱].dbo.[同步資料檢視]
IF @currentVersion IS NOT NULL
BEGIN
PRINT ''更新版本''
UPDATE [dbo].[SyncTable] SET SyncVersion=@currentVersion WHERE @tableName=tableName AND IsInitOver=1
end
END
ELSE
BEGIN
PRINT ''無資料更新''
END
END

相關文章