在彈出來的
Add Filter這個頁面,在左邊的欄裡你可以到表中的欄位都羅列出來了,雙擊CityId列將它移到右邊的
Fileter statement,增加一個條件像CityId=1這樣的,這樣的話就會減小訂閱使用者同步資料的數量,當然這裡的值你必須定義一個常量,因此這個叫做
Static Filter(靜態查詢).
在我們的應用中表裡的資料有幾百萬條是一件很正常的事,但有時候裝置所需要的資料卻僅僅是這幾百萬條中的幾千條,這個時候靜態過濾就派上它的用場了。我們繼續,先將CityId=1刪除掉因為我們有更重要的條件要應用。
如果你想減小用戶端同步資料的數量,舉個例子,就想我們這裡的應用一樣,每個使用者只需同步他相應城市的資料,我們有欄位CityId可以做到這個過濾,但我們不能用靜態過濾,因為那隻能過濾到一個城市。其實這個時候我們有個方法那就是用Parameterized Filter(參數查詢).這裡要求使用到 SQL SERVER的HOST_NAME()這個函數來實現這個過濾,只需將Replication對象的屬性設定成HOST_NAME()所對應的值就可以了。你似乎可以寫成下面這樣的條件:
WHERE [CityId]=CONVERT(int,HOST_NAME())
不過很不幸的是,這樣子的結果是無法建立Publication,因為HOST_NAME()的值是無法強制轉換成Integer類型的。不過你可以這樣寫:
CONVERT(nchar,CityId)=HOST_NAME()
其實解決這個問題也不難,你可以執行sp_changemergearticle預存程序來替換下面的條件
WHERE [CityId]=CONVERT(int,HOST_NAME())
整個的執行過程如下所示:
USE [ParkSurvey]
EXEC sp_changemergearticle
@publication='ParkSurveyPublication',
@article='Cities',
@property='subset_filterclause',
@value='CityId=CONVERT(int,HOST_NAME())',
@force_invalidate_snapshot=1,
@force_reinit_subscription=1;
GO
這樣做的結果是建立一個快照檔案夾,但效能會比上面的好。
最後我們來看看Add Filter頁面中底部的選項按鈕,對於每一張建立參數查詢的表來說,你既不能在各個訂閱者的HOSTNAME的值是一樣的時候選擇第一個按鈕,也不能在各個訂閱者的HOSTNAME的值不一樣時選擇第二個按鈕,這很重要因為這樣子會報錯。如果每個訂閱者的HOSTNAME的值是唯一的值的時候你應該選擇第二個按鈕。因此所有的靜態查詢你都必須選擇第一個按鈕讓每一行的資料都發送給每個訂閱者。點擊OK,一個有查詢條件的表就顯示在 Filter Table Rows頁面上了。
好了,一個有同步參數的表就被建立了,下面我要教你如何與另外張表進行關聯。在我們的例子裡面,Cities表只讓訂閱者同步訂閱者所對應的城市,但如果訂閱者也想查看Parks表裡的資料的話,這個就不能夠滿足我們的需求了。這裡CityId是Parks的外鍵,我們可以擴充Cities表中的 HOSTNAME查詢條件,選擇Cities,點擊Add按鈕,然後選擇 Add Join to Extend the Selected Filter..如所示的。
Add Join菜單會列出你可以關聯的所有的表
這裡,我們選擇Parks做為我們要去關聯的表。
在我們的例子中,左邊Filtered table column顯示的是顯示的主表的列,右邊Joined table column顯示的是想要與主表關聯的列。在下面的預覽文字框中你可以看到主表與它的外鍵是怎麼關聯起來的。你可以點擊選擇你所需要關聯的列,當然你也可以手動建立它們當你們點擊Write the Join statement manually.這裡我們以一對多的關係關聯Cities和Parks的CityId.因為CityId在各自的表中都是為主鍵,因此我們將下面的Unique key複選框選上。(這樣子能改進同步的效能,也只有當關聯的欄位是主鍵時才有效),然後我們點擊OK。
在Filter Table Rows就能夠顯示我們加了同步查詢條件的表跟它的關聯表了,點擊Next.
在Snapshot Agent頁面將會提示你是否立即建立快照,在這裡你也可以點擊change來修改快照代理的頻率,在這個例子中我們選擇14天,然後我們點擊Next.
在Agent Security頁面,我們要選擇快照代理線程運行在哪個賬戶底下,所以我們選擇點擊Security Settings.
接下來的是Snapshot Agent Security 頁面,選擇Run under the following Windows account單選框,然後輸入SYNCDOMAIN/syncuser在Process account文字框中,在密碼跟確認密碼都輸入P@ssw0rd,細心的您一定會發現,這個使用者就是我們建立的域使用者,在確認By impersonating the process account選項按鈕已經被選上後就可以點擊OK了。
回到Agent Security這個頁面,Snapshot Agent裡就有我們剛剛所加入的syncuser使用者了。然後我們點擊Next.
在Wizard Actions頁面,我們把兩個複選框的內容都選上,然後點擊Next.
在Script File Properties頁面,這個頁面讓我們選擇指令碼的存放位置,我們保持預設的選擇然後點擊Next.
在最後的Complete the Wizard頁面,我們在Publication name那輸入ParkSurveryPublication做為我們發布複製的名稱,當我們確認我們填入的資訊跟下面顯示的資訊一致時我們就可以點擊Finish來完成這個Publication了.
在Creating Publication這個頁面我們就可以看到這個Publication的完成情況了,如果都顯示success的話我們就可以點擊Close來關閉它,這樣一個Publication就被建立起來了。