SQL Server的存儲過程複製執行

SQL Server的事務複製時有個問題讓人困擾,就是在發佈端的一個語句,如果涉及n條記錄,則在訂閱端會執行n次。

 

比如 delete T1 where id between 1 and 50

 

如果發佈端有50條記錄,則訂閱服務器會自動將這個語句翻譯成delete相關的存儲過程,執行50次!!

 

其實SQL Server針對這種情況給了一種解決方案,就是複製存儲過程的執行。

 

首先將要執行的語句封裝在存儲過程裏,然後配置發佈項時,將存儲過程一起發佈

 

注意:在創建的時候作如下操作:

 

 

發佈存儲過程的執行

  1. 在新建發佈嚮導的“項目”頁或“發佈屬性 - <發佈>”對話框中,選擇一個存儲過程。

  2. 單擊“項目屬性”,然後單擊“設置突出顯示的存儲過程項目的屬性”

  3. “項目屬性 - <項目>”對話框中,爲“複製”選項指定下列值之一:

    • 存儲過程的執行
    • SP 的序列化事務中的執行
      建議選擇此選項,因爲此選項僅當過程在可序列化事務的上下文中執行時才複製過程的執行。 如果存儲過程在可序列化事務的外部執行,則已發佈表中的數據更改將複製爲一系列數據操作語言 (DML) 語句。
  4. 單擊“確定”。

  5. 如果在“發佈屬性 - <發佈>”對話框中,請單擊“確定”保存並關閉對話框。

  6.  

這裏很多人都會被“SP的序列化事務的執行”所矇蔽,想當然的以爲這個可以實現穿透,將存儲過程的執行動作複製過去,實際上不是這樣的。

筆者作了多方嘗試,對所謂的序列化測試發現,這個選項不起作用,使用SET TRANSACTION ISOLATION LEVEL SERIALIZABLE也未生效,不知道到底這個選項是何含義。不過,這並不違背筆者的本意:測試怎樣讓存儲過程執行復制到訂閱端去。

 

真正的答案是“存儲過程的執行”,如下圖所示:

複製存儲過程執行

 

最後提醒各位注意,在測試的過程中,如果變更了存儲過程的定義,請啓動複製,並且驗證修改後的存儲過程是否真正的發佈到了訂閱端,否則就會象筆者一樣,嘗試了n次才發現,原來訂閱端的存儲過程還是最初傳過去的那個 ~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章