在彈出來的Add Filter這個頁面,在左邊的欄里你可以到表中的字段都羅列出來了,雙擊CityId列將它移到右邊的Fileter statement,增加一個條件像CityId=1這樣的,這樣的話就會減小訂閱用戶同步數(shù)據(jù)的數(shù)量,當(dāng)然這里的值你必須定義一個常量,因此這個叫做Static Filter(靜態(tài)查詢).
在我們的應(yīng)用中表里的數(shù)據(jù)有幾百萬條是一件很正常的事,但有時候設(shè)備所需要的數(shù)據(jù)卻僅僅是這幾百萬條中的幾千條,這個時候靜態(tài)過濾就派上它的用場了。我們繼續(xù),先將CityId=1刪除掉因為我們有更重要的條件要應(yīng)用。
如果你想減小客戶端同步數(shù)據(jù)的數(shù)量,舉個例子,就想我們這里的應(yīng)用一樣,每個用戶只需同步他相應(yīng)城市的數(shù)據(jù),我們有字段CityId可以做到這個過濾,但我們不能用靜態(tài)過濾,因為那只能過濾到一個城市。其實這個時候我們有個方法那就是用Parameterized Filter(參數(shù)查詢).這里要求使用到 SQL SERVER的HOST_NAME()這個函數(shù)來實現(xiàn)這個過濾,只需將Replication對象的屬性設(shè)置成HOST_NAME()所對應(yīng)的值就可以了??荚嚧筇崾?你似乎可以寫成下面這樣的條件:
WHERE [CityId]=CONVERT(int,HOST_NAME())
不過很不幸的是,這樣子的結(jié)果是無法創(chuàng)建Publication,因為HOST_NAME()的值是無法強制轉(zhuǎn)換成Integer類型的。不過你可以這樣寫:
CONVERT(nchar,CityId)=HOST_NAME()
其實解決這個問題也不難,你可以執(zhí)行sp_changemergearticle存儲過程來替換下面的條件
WHERE [CityId]=CONVERT(int,HOST_NAME())
整個的執(zhí)行過程如下所示:
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這樣做的結(jié)果是新建一個快照文件夾,但性能會比上面的好。
最后我們來看看Add Filter頁面中底部的單選按鈕,對于每一張建立參數(shù)查詢的表來說,你既不能在各個訂閱者的HOSTNAME的值是一樣的時候選擇第一個按鈕,也不能在各個訂閱者的HOSTNAME的值不一樣時選擇第二個按鈕,這很重要因為這樣子會報錯。如果每個訂閱者的HOSTNAME的值是的值的時候你應(yīng)該選擇第二個按鈕。因此所有的靜態(tài)查詢你都必須選擇第一個按鈕讓每一行的數(shù)據(jù)都發(fā)送給每個訂閱者。點擊OK,一個有查詢條件的表就顯示在 Filter Table Rows頁面上了。
好了,一個有同步參數(shù)的表就被建立了,下面我要教你如何與另外張表進行關(guān)聯(lián)。在我們的例子里面,Cities表只讓訂閱者同步訂閱者所對應(yīng)的城市,但如果訂閱者也想查看Parks表里的數(shù)據(jù)的話,這個就不能夠滿足我們的需求了。這里CityId是Parks的外鍵,我們可以擴展Cities表中的 HOSTNAME查詢條件,選擇Cities,點擊Add按鈕,然后選擇 Add Join to Extend the Selected Filter.。
Add Join菜單會列出你可以關(guān)聯(lián)的所有的表
這里,我們選擇Parks做為我們要去關(guān)聯(lián)的表。
在我們的例子中,左邊Filtered table column顯示的是顯示的主表的列,右邊Joined table column顯示的是想要與主表關(guān)聯(lián)的列。在下面的預(yù)覽文本框中你可以看到主表與它的外鍵是怎么關(guān)聯(lián)起來的。你可以點擊選擇你所需要關(guān)聯(lián)的列,當(dāng)然你也可以手動創(chuàng)建它們當(dāng)你們點擊Write the Join statement manually.這里我們以一對多的關(guān)系關(guān)聯(lián)Cities和Parks的CityId.因為CityId在各自的表中都是為主鍵,因此我們將下面的Unique key復(fù)選框選上。(這樣子能改進同步的性能,也只有當(dāng)關(guān)聯(lián)的字段是主鍵時才有效),然后我們點擊OK。
在Filter Table Rows就能夠顯示我們加了同步查詢條件的表跟它的關(guān)聯(lián)表了,點擊Next.
在Snapshot Agent頁面將會提示你是否立即建立快照,在這里你也可以點擊change來修改快照代理的頻率,在這個例子中我們選擇14天,然后我們點擊Next.
在Agent Security頁面,我們要選擇快照代理線程運行在哪個賬戶底下,所以我們選擇點擊Security Settings.
接下來的是Snapshot Agent Security 頁面,選擇Run under the following Windows account單選框,然后輸入SYNCDOMAINsyncuser在Process account文本框中,在密碼跟確認(rèn)密碼都輸入P@ssw0rd,細(xì)心的您一定會發(fā)現(xiàn),這個用戶就是我們創(chuàng)建的域用戶,在確認(rèn)By impersonating the process account單選按鈕已經(jīng)被選上后就可以點擊OK了。
回到Agent Security這個頁面,Snapshot Agent里就有我們剛剛所加入的syncuser用戶了。然后我們點擊Next.
在Wizard Actions頁面,我們把兩個復(fù)選框的內(nèi)容都選上,然后點擊Next.
在Script File Properties頁面,這個頁面讓我們選擇腳本的存放位置,我們保持默認(rèn)的選擇然后點擊Next.
在最后的Complete the Wizard頁面,我們在Publication name那輸入ParkSurveryPublication做為我們發(fā)布復(fù)制的名稱,當(dāng)我們確認(rèn)我們填入的信息跟下面顯示的信息一致時我們就可以點擊Finish來完成這個Publication了.
在Creating Publication這個頁面我們就可以看到這個Publication的完成情況,我們就可以點擊Close來關(guān)閉它,這樣一個Publication就被建立起來了
在我們的應(yīng)用中表里的數(shù)據(jù)有幾百萬條是一件很正常的事,但有時候設(shè)備所需要的數(shù)據(jù)卻僅僅是這幾百萬條中的幾千條,這個時候靜態(tài)過濾就派上它的用場了。我們繼續(xù),先將CityId=1刪除掉因為我們有更重要的條件要應(yīng)用。
如果你想減小客戶端同步數(shù)據(jù)的數(shù)量,舉個例子,就想我們這里的應(yīng)用一樣,每個用戶只需同步他相應(yīng)城市的數(shù)據(jù),我們有字段CityId可以做到這個過濾,但我們不能用靜態(tài)過濾,因為那只能過濾到一個城市。其實這個時候我們有個方法那就是用Parameterized Filter(參數(shù)查詢).這里要求使用到 SQL SERVER的HOST_NAME()這個函數(shù)來實現(xiàn)這個過濾,只需將Replication對象的屬性設(shè)置成HOST_NAME()所對應(yīng)的值就可以了??荚嚧筇崾?你似乎可以寫成下面這樣的條件:
WHERE [CityId]=CONVERT(int,HOST_NAME())
不過很不幸的是,這樣子的結(jié)果是無法創(chuàng)建Publication,因為HOST_NAME()的值是無法強制轉(zhuǎn)換成Integer類型的。不過你可以這樣寫:
CONVERT(nchar,CityId)=HOST_NAME()
其實解決這個問題也不難,你可以執(zhí)行sp_changemergearticle存儲過程來替換下面的條件
WHERE [CityId]=CONVERT(int,HOST_NAME())
整個的執(zhí)行過程如下所示:
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這樣做的結(jié)果是新建一個快照文件夾,但性能會比上面的好。
最后我們來看看Add Filter頁面中底部的單選按鈕,對于每一張建立參數(shù)查詢的表來說,你既不能在各個訂閱者的HOSTNAME的值是一樣的時候選擇第一個按鈕,也不能在各個訂閱者的HOSTNAME的值不一樣時選擇第二個按鈕,這很重要因為這樣子會報錯。如果每個訂閱者的HOSTNAME的值是的值的時候你應(yīng)該選擇第二個按鈕。因此所有的靜態(tài)查詢你都必須選擇第一個按鈕讓每一行的數(shù)據(jù)都發(fā)送給每個訂閱者。點擊OK,一個有查詢條件的表就顯示在 Filter Table Rows頁面上了。
好了,一個有同步參數(shù)的表就被建立了,下面我要教你如何與另外張表進行關(guān)聯(lián)。在我們的例子里面,Cities表只讓訂閱者同步訂閱者所對應(yīng)的城市,但如果訂閱者也想查看Parks表里的數(shù)據(jù)的話,這個就不能夠滿足我們的需求了。這里CityId是Parks的外鍵,我們可以擴展Cities表中的 HOSTNAME查詢條件,選擇Cities,點擊Add按鈕,然后選擇 Add Join to Extend the Selected Filter.。
Add Join菜單會列出你可以關(guān)聯(lián)的所有的表
這里,我們選擇Parks做為我們要去關(guān)聯(lián)的表。
在我們的例子中,左邊Filtered table column顯示的是顯示的主表的列,右邊Joined table column顯示的是想要與主表關(guān)聯(lián)的列。在下面的預(yù)覽文本框中你可以看到主表與它的外鍵是怎么關(guān)聯(lián)起來的。你可以點擊選擇你所需要關(guān)聯(lián)的列,當(dāng)然你也可以手動創(chuàng)建它們當(dāng)你們點擊Write the Join statement manually.這里我們以一對多的關(guān)系關(guān)聯(lián)Cities和Parks的CityId.因為CityId在各自的表中都是為主鍵,因此我們將下面的Unique key復(fù)選框選上。(這樣子能改進同步的性能,也只有當(dāng)關(guān)聯(lián)的字段是主鍵時才有效),然后我們點擊OK。
在Filter Table Rows就能夠顯示我們加了同步查詢條件的表跟它的關(guān)聯(lián)表了,點擊Next.
在Snapshot Agent頁面將會提示你是否立即建立快照,在這里你也可以點擊change來修改快照代理的頻率,在這個例子中我們選擇14天,然后我們點擊Next.
在Agent Security頁面,我們要選擇快照代理線程運行在哪個賬戶底下,所以我們選擇點擊Security Settings.
接下來的是Snapshot Agent Security 頁面,選擇Run under the following Windows account單選框,然后輸入SYNCDOMAINsyncuser在Process account文本框中,在密碼跟確認(rèn)密碼都輸入P@ssw0rd,細(xì)心的您一定會發(fā)現(xiàn),這個用戶就是我們創(chuàng)建的域用戶,在確認(rèn)By impersonating the process account單選按鈕已經(jīng)被選上后就可以點擊OK了。
回到Agent Security這個頁面,Snapshot Agent里就有我們剛剛所加入的syncuser用戶了。然后我們點擊Next.
在Wizard Actions頁面,我們把兩個復(fù)選框的內(nèi)容都選上,然后點擊Next.
在Script File Properties頁面,這個頁面讓我們選擇腳本的存放位置,我們保持默認(rèn)的選擇然后點擊Next.
在最后的Complete the Wizard頁面,我們在Publication name那輸入ParkSurveryPublication做為我們發(fā)布復(fù)制的名稱,當(dāng)我們確認(rèn)我們填入的信息跟下面顯示的信息一致時我們就可以點擊Finish來完成這個Publication了.
在Creating Publication這個頁面我們就可以看到這個Publication的完成情況,我們就可以點擊Close來關(guān)閉它,這樣一個Publication就被建立起來了