在我們日常使用SQL Server數據庫時,經常遇到需要在實例Instance01中跨實例訪問Instance02中的數據。例如在做數據遷移時,如下語句:
insert into Instance01.DB01.dbo.Table01
select * from Instance02.DB01.dbo.Table01
普通情況下,這樣做是不允許的,因為SQL Server默認不可以跨實例訪問數據。解決方案是使用存儲過程sp_addlinkedserver進行實例注冊。
sp_addlinkedserver在MSDN中的定義為:
sp_addlinkedserver [ @server= ] 'server' [ , [ @srvproduct= ] 'product_name' ]
[ , [ @provider= ] 'provider_name' ]
[ , [ @datasrc= ] 'data_source' ]
[ , [ @location= ] 'location' ]
[ , [ @provstr= ] 'provider_string' ]
[ , [ @catalog= ] 'catalog' ]
例如:在Instance01實例中,執行如下SQL語句EXEC sp_addlinkedserver ‘Instance02’ //只寫第一個參數即可,默認情況下,注冊的是SQL Server數據庫,其他參數用法詳見MSDN。
如果你的兩個實例在同一個域中,且Instance01與Instance02有共同的域登陸帳號,那麼經過上面的注冊後,前面的insert語句就可以執行了。否則,還需要對注冊的遠程實例進行登陸帳號注冊,在Instance01實例中,執行如下SQL語句
EXEC sp_addlinkedsrvlogin 'InstanceName','true' //使用集成認證訪問遠程實例
或者 EXEC sp_addlinkedsrvlogin 'InstanceName','false','TJVictor,'sa','Password1' //使用Windows認證訪問遠程實例,當用戶以TJVictor用戶登陸Instance01實例訪問Instance02時,默認把TJVictor映射成sa,且密碼為PassWord1
經過 sp_addlinkedserver實例注冊和sp_addlinkedsrvlogin登陸帳戶注冊後,就可以在Instance01中直接訪問Instance02中的數據庫數據了。
如果還無法訪問,請檢查本機DNS是否可以解析遠程數據庫的實例名。如果無法解析,可以在EXEC sp_addlinkedserver ‘Instance02’中把Instance02換為IP,或者在hosts文件中,自己建立相應DNS映射。
下面列舉幾個跨實例數據庫訪問的存儲過程和視圖。
存儲過程名/視圖名 作用 舉例
sp_addlinkedserver 注冊遠程數據庫實例 exec sp_addlinkedserver ‘InstanceName’
sp_dropserver 刪除遠程數據庫實例 exec sp_dropserver ‘InstanceName’
sp_addlinkedsrvlogin 注冊遠程實例登陸訪問帳戶 exec sp_addlinkedsrvlogin ‘InstanceName’, null
sp_droplinkedsrvlogin 刪除遠程實例登陸訪問帳戶 EXEC sp_droplinkedsrvlogin 'InstanceName','UserName'
sp_helpserver 當前實例已注冊的可訪問的實例(即查看使用sp_addlinkedserver已注冊過的實例) sp_helpserver
sys.sysservers 功能同sp_helpserver select * from sys.sysservers
sys.linked_logins 查看已注冊的登陸訪問帳戶(即查看使用sp_addlinkedsrvlogin已注冊過的帳戶) select * from sys.linked_logins
sys.remote_logins 查看已注冊的遠端訪問帳戶 select * from sys.remote_logins