首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 跨伺服器資料同步:連結伺服器 + MERGE 模式

     編輯:關於SqlServer

架構概覽

  • 來源:192.168.0.3 (IP1) 資料庫 dbPM 視圖 v_custom
  • 目標:192.168.0.10 (IP2) 資料庫 dbCRM 表 t_custom
  • 邏輯:不存在則 INSERT,存在則 UPDATE(UPSERT)
  • 排程:SQL Server Agent 作業定時呼叫預存程序

預存程序核心碼

CREATE PROCEDURE [dbo].[p_pm_項目平台客戶批量同步到報銷平台]
    @destserver NVARCHAR(50),   -- 目標連結伺服器名稱
    @sourceserver NVARCHAR(50)  -- 來源連結伺服器名稱
AS
BEGIN
    SET NOCOUNT ON;

    -- 1. 動態確保連結伺服器存在
    IF NOT EXISTS (SELECT * FROM sys.servers WHERE server_id != 0 AND data_source = @destserver)
        EXEC sp_addlinkedserver @server = @destserver;
    IF NOT EXISTS (SELECT * FROM sys.servers WHERE server_id != 0 AND data_source = @sourceserver)
        EXEC sp_addlinkedserver @server = @sourceserver;

    BEGIN TRY
        SET XACT_ABORT ON;
        BEGIN TRAN;

        -- 2. INSERT 不存在的客戶
        INSERT INTO [192.168.0.10].[dbCRM].[dbo].[t_custom] (
            客戶ID, 客戶名稱, 客戶簡稱, 輸入碼, 查詢碼, 地址,
            錄入登錄名, 錄入時間, 修改登錄名, 修改時間,
            審批狀態ID, 審批狀態名稱, 是否審批結束, 審批操作時間,
            項目管理客商編碼, 序號
        )
        SELECT
            A.客戶ID, A.客戶名稱, A.客戶簡稱,
            dbo.fn_pm_GetPy(A.客戶名稱),
            A.客戶編號 + ',' + A.客戶名稱 + ',' + dbo.fn_pm_GetPy(A.客戶名稱) + ',' + A.客戶簡稱 + ',' + dbo.fn_pm_GetPy(A.客戶簡稱),
            A.地址, 'admin', GETDATE(), NULL, NULL,
            'D65F87A8-79C8-4D1C-812D-AE4591E056A8', '已審批', 1, A.審批操作時間,
            A.項目管理客商編碼, 0
        FROM [dbPM].[dbo].[v_custom] A
        WHERE A.客戶ID NOT IN (SELECT 客戶ID FROM [192.168.0.10].[dbCRM].[dbo].[t_custom]);

        -- 3. UPDATE 已存在的客戶
        UPDATE A
        SET A.客戶名稱 = B.客戶名稱,
            A.客戶簡稱 = B.客戶簡稱,
            A.輸入碼 = dbo.fn_pm_GetPy(B.客戶名稱),
            A.查詢碼 = B.客戶編號 + ',' + B.客戶名稱 + ',' + dbo.fn_pm_GetPy(B.客戶名稱) + ',' + B.客戶簡稱 + ',' + dbo.fn_pm_GetPy(B.客戶簡稱),
            A.地址 = B.地址,
            A.修改登錄名 = 'admin',
            A.修改時間 = GETDATE(),
            A.項目管理客商編碼 = B.項目管理客商編碼
        FROM [192.168.0.10].[dbCRM].[dbo].[t_custom] A
        JOIN [dbPM].[dbo].[v_custom] B ON A.客戶ID = B.客戶ID;

        COMMIT TRAN;
    END TRY
    BEGIN CATCH
        SELECT ERROR_NUMBER() AS errornumber, ERROR_MESSAGE() AS errormsg, ERROR_LINE() AS errorline;
        ROLLBACK TRAN;
    END CATCH
END
GO

分散式交易 (MSDTC) 設定關鍵

跨伺服器寫入需啟用 MSDTC,否則會報錯 7391「無法啟動分散式交易」。

  1. 兩台伺服器皆開啟「元件服務」→「電腦」→「我的電腦」→「屬性」→「MSDTC」→「安全性設定」。
  2. 勾選:「網路 DTC 存取」、「允許遠端用戶端」、「允許輸入/輸出」、「無需驗證」、「啟用 TIP」。
  3. 重啟 MSDTC 服務與 SQL Server 服務。

MSDTC 安全性設定

現代化替代方案

  • SQL Server 2008+ 可改用 MERGE 陳述式簡化 UPSERT 邏輯。
  • 若版本支援,考慮 CHANGE TRACKING / CDC + SSIS / Azure Data Factory 實現增量同步,減少全量掃描。
  • 跨網域/雲端建議使用 Service Broker、Kafka 或 CDC 工具(Debezium)解耦。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved