兩台獨立 SQL Server (A、B) 部署結構相同的表,雙方均有增刪改操作,需即時雙向同步保持資料一致。
EXEC sp_addlinkedserver @server = 'SRV_B', @srvproduct = '',
@provider = 'SQLNCLI', @datasrc = 'B_IP_or_Instance';
EXEC sp_addlinkedsrvlogin @rmtsrvname = 'SRV_B', @useself = 'FALSE',
@locallogin = NULL, @rmtuser = 'sync_user', @rmtpassword = 'StrongPwd';
-- 新增同步
CREATE TRIGGER tr_Sync_Insert ON dbo.Author
AFTER INSERT
AS
BEGIN
SET XACT_ABORT ON;
INSERT SRV_B.TargetDB.dbo.Author (ID, Name, TelPhone)
SELECT ID, Name, Phone FROM inserted;
END;
GO
-- 修改同步
CREATE TRIGGER tr_Sync_Update ON dbo.Author
AFTER UPDATE
AS
BEGIN
SET XACT_ABORT ON;
UPDATE B SET Name = I.Name, TelPhone = I.Phone
FROM SRV_B.TargetDB.dbo.Author B
JOIN inserted I ON B.ID = I.ID;
END;
GO
-- 刪除同步
CREATE TRIGGER tr_Sync_Delete ON dbo.Author
AFTER DELETE
AS
BEGIN
SET XACT_ABORT ON;
DELETE B
FROM SRV_B.TargetDB.dbo.Author B
JOIN deleted D ON B.ID = D.ID;
END;
GO
IF TRIGGER_NESTLEVEL() > 1 RETURN; 或使用 CONTEXT_INFO 標記來源TRY...CATCH,記錄失敗至錯誤表,發送告警CREATE PROC usp_Sync_Author_Batch
AS
BEGIN
SET XACT_ABORT ON;
BEGIN TRAN;
-- 更新已變更
UPDATE B SET Name = A.Name, TelPhone = A.Phone
FROM SRV_B.TargetDB.dbo.Author B
JOIN dbo.Author A ON B.ID = A.ID
WHERE B.Name <> A.Name OR B.TelPhone <> A.Phone;
-- 插入新增
INSERT SRV_B.TargetDB.dbo.Author (ID, Name, TelPhone)
SELECT ID, Name, Phone FROM dbo.Author A
WHERE NOT EXISTS (SELECT 1 FROM SRV_B.TargetDB.dbo.Author WHERE ID = A.ID);
-- 刪除已移除 (視業務決定是否啟用)
-- DELETE B FROM SRV_B.TargetDB.dbo.Author B
-- WHERE NOT EXISTS (SELECT 1 FROM dbo.Author WHERE ID = B.ID);
COMMIT TRAN;
END;
搭配 SQL Agent 作業每 5-15 分鐘執行一次。
| 維度 | 觸發器即時同步 | 定時批次同步 |
|---|---|---|
| 延遲 | 毫秒級 | 分鐘級 |
| 一致性 | 強一致 (分散式交易) | 最終一致 |
| 衝突處理 | 分散式交易自動回滾 | 需自行實作合併邏輯 |
| 網路中斷韌性 | 差 (本地交易阻塞) | 好 (失敗重試) |
| 適用場景 | 低併發、強一致需求、雙主雙寫少 | 高併發、可容忍短暫不一致、跨地域 |