SQLserver 2008同步複製建立後新增表/函數/存儲過程(不從新初始化快照)sql
1、在生產環境中已有事務複製中(複製類型爲事務發佈),須要對已有發佈的數據庫新增表、視圖、存儲過程等,這些變動是不會同步到從庫中。如必須應用到從庫,有如下兩種方法:數據庫
一、若是採用默認的設置,每次都須要從新初始化快照,從庫從新應用快照和未執行的同步命令,這在生產環境中對數據庫壓力或性能或DBA可維護性表現的不好。服務器
二、將新增的架構變動新建一個新的發佈訂閱,但會形成維護困難,增長出錯的概率。架構
三、能夠經過設置immediate_sync和allow_anonymous 來實現不從新初始化快照的前提下,在原有的發佈訂閱中新增表/函數/存儲過程。ide
immediate_sync:指定每次運行快照代理時是否爲發佈建立同步文件。 函數
immediate_synchronization的數據類型爲 nvarchar(5),默認值爲 FALSE。 若是爲 True,表示每次運行快照代理時都建立或從新建立同步文件。 若是快照代理在訂閱建立前完成,則訂閱服務器能夠當即得到同步文件。 新訂閱將獲取最近一次執行快照代理所生成的最新同步文件。 independent_agent 必須爲 true,以便於 immediate_synchronization 爲 true。 若是爲 False,則僅當有新訂閱時,才建立同步文件。 當以增量方式向現有發佈添加新項目時,必須爲每一個訂閱調用 sp_addsubscription。 訂閱後訂閱服務器沒法接收同步文件,直到啓動並完成快照代理爲止。性能
allow_anonymous:指定是否可爲給定發佈建立匿名訂閱。 測試
allow_anonymous的數據類型爲nvarchar(5),默認值爲 FALSE。若是爲True,則immediate_synchronization 也必須設置爲True。 若是爲False,則表示不容許對該發佈建立匿名訂閱。spa
##注意:從定義中看出來,immediate_sync爲false時,新的項目(表、存儲過程等)能夠以增量方式發佈,而allow_anonymous也必須爲false,immediate_sync才能爲false。.net
##同時若是刪除發佈項目的中已發佈的表/函數/存儲過程/字段訂閱庫中的對應的表/函數/存儲過程/字段仍然被保留,如要刪除必須手工操做
2、根據以上定義進行測試
一、示例庫爲platform1126(發佈數據庫),訂閱數據庫爲TDB1
##注意:這裏如何建立事務發佈的複製操做(事務發佈中的數據庫全部表都須要主鍵列。),能夠自行百度,或參考如下連接:http://blog.csdn.net/hliq5399/article/details/51678774
二、建立事務發佈發佈名稱爲:pl_tdb,發佈數據庫上(platform1126)查看immediate_sync、allow_anonymous這兩個屬性當前默認屬性。
USE platform1126 sp_helppublication; 或者: select immediate_sync ,allow_anonymous from dbo .syspublications 查其默認結果爲: immediate_sync allow_anonymous 1 1 #修改immediate_sync、allow_anonymous參數爲false或0: use platform1126; GO EXEC sp_changepublication @publication = 'pl_tdb', #publication爲發佈名稱 @property = 'allow_anonymous', @value = 'false' GO EXEC sp_changepublication @publication = 'pl_tdb', @property = 'immediate_sync' , @value = 'false' GO #從新檢查其設置結果 select immediate_sync ,allow_anonymous from dbo .syspublications 查其默認結果爲: immediate_sync allow_anonymous 0 0
三、在platform1126發佈數據庫中,從新添加新發布項目Advertise表
四、啓動複製監視器,並啓動快照代理,並查看詳細
五、查看訂閱庫TDB1,是否已經同步Advertise表
##注:新增函數/存儲過程相似如上操做,新增字段直接在發佈庫執行便可