先說一下我遇到的環境,我手上有N個SQL Server Express Edition的數據庫,他們的結構都是一樣的,只是存放的數據不一樣,數據庫的個數將會增長。現在我希望能查詢這些數據,其中比較笨的方法是,每個數據庫都連接一下,執行SQL,示意圖如下:
這種做法的缺點是:應用程序相對復雜,如果弄不好,後期的可維護性不好。
第二種方法是使用SQL Server的訂閱發布功能,定時從各個數據庫導出需要的數據到一個“中心數據庫”,應用程序就比較簡單,畢竟只是鏈接一個SQL Server啊,示意圖如下:
但是配置SQL Server的訂閱發布還是比較麻煩,而且SQL Server Express Edition的數據庫的個數還會增長,每個都這樣配置一下,工作量很大。
綜合考慮以上兩種方案的優缺點,使用SQL Server的鏈接服務器功能可以很容易地解決這個問題。
在中心數據庫上,執行如下語句,建立“鏈接服務器”和“鏈接服務器登錄”,語句如下:
exec sp_addlinkedserver '12.34.56.41','SQL Server'; exec sp_addlinkedsrvlogin '12.34.56.41','false',null,'dbUser','p@ssw0rd' exec sp_addlinkedserver '12.34.56.42','SQL Server'; exec sp_addlinkedsrvlogin '12.34.56.42','false',null,'dbUser','p@ssw0rd' .......... .......... .......... .......... .......... exec sp_addlinkedserver '12.34.56.47','SQL Server'; exec sp_addlinkedsrvlogin '12.34.56.47','false',null,'dbUser','p@ssw0rd' exec sp_addlinkedserver '12.34.56.48','SQL Server'; exec sp_addlinkedsrvlogin '12.34.56.48','false',null,'dbUser','p@ssw0rd'
雖然語句比較多,但是不難發現完全可以找個“工具”生成一下,新增的數據庫只需要執行類似的語句就可以了。
查詢語句要加上服務器名,如下:
select e.ID as VMID, e.NAME, v.ip_address as vm_ip, v.power_state as power_state, v.guest_state as guest_state , h.ip_address as host_ip from [12.34.56.41].VIM_VCDB.dbo.VPX_ENTITY e, [12.34.56.41].VIM_VCDB.dbo.VPX_VM v , [12.34.56.41].VIM_VCDB.dbo.vpx_host h where e.ID = v.ID and v.host_id = h.id
為了讓數據查詢起來更加方便,我揀了一個視圖,將多個數據庫的數據“集中”起來
create view vIEw_vm_info as select e.ID as VMID, e.NAME, v.ip_address as vm_ip, v.power_state as power_state, v.guest_state as guest_state , h.ip_address as host_ip from [12.34.56.41].VIM_VCDB.dbo.VPX_ENTITY e, [12.34.56.41].VIM_VCDB.dbo.VPX_VM v , [12.34.56.41].VIM_VCDB.dbo.vpx_host h where e.ID = v.ID and v.host_id = h.id union all .................... .................... .................... .................... union all select e.ID as VMID, e.NAME, v.ip_address as vm_ip, v.power_state as power_state, v.guest_state as guest_state , h.ip_address as host_ip from [12.34.56.47].VIM_VCDB.dbo.VPX_ENTITY e, [12.34.56.47].VIM_VCDB.dbo.VPX_VM v , [12.34.56.47].VIM_VCDB.dbo.vpx_host h where e.ID = v.ID and v.host_id = h.id
但是查詢鏈接服務器的性能不太好,於是,我在“中心”數據庫建一張表,和視圖的結構一樣,用於存放試圖中的數據。