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