程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server如何跨實例訪問數據庫

SQL Server如何跨實例訪問數據庫

編輯:關於SqlServer

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved