sql server 跨實例訪問數據庫

我們日常使用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 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章