[靈異事件簿] MS SQL Server Linked Server 資料源為空白時的異常行為 | Strange behavior of SQL Server Linked Server When Data Source Is Null



某日同事回報 SQL 從遠端抓取資料的時候怪怪的,

透過 Linked Server 查詢的結果跟直接連到機器上查詢的結果不一樣!😕

經檢查 Linked Server 的設定,發現設定項目怪怪的,如下圖:


在選擇 [Other data source] 選項下,並沒有特別指定 [Data source] 的項目,

也就是說 Data source IS NULL!! (大驚 👀👀👀)

建置的過程中並沒有出現任何錯誤訊息 💀💀💀

這就怪了,展開資料庫後發現 .... 怪怪的, 怪怪的, 怪怪的

怎麼連到自己本機了???


為什麼會知道是連到自己?因為平常為了區別自己連到哪台機器,

所以會設定一個旗標資料庫(Database Flag)用來區別。

要是沒有設定這個的話,我想找老半天也很難發現疑點 Orz...

這就奇怪了,既不是使用 Linked server 名稱指定的資訊,Data source 又是空的!?

那他到底是怎麼連線的呢?


檢查建立語法也並無特別之處


只好從 [sp_addlinkedserver] 下手,看了一下發現裡面針對參數檢查主要是檢查

@srvproduct 與 @provider 這兩個值,而 @datasrc 本身就是預設 NULL,

所以當執行時也是正常的,而 [sys.sp_MSaddserver_internal] 似乎照不到,不得而知。

最後只得再找找 MDSN 了。


從文件上可以看到,若 @srvproduct 指定為 [SQL Server] 時,其他參數都不用指定,

而且會使用 @server 的內容來連線伺服器,這也是一般常用的方式。


但這次的問題是使用其他方式的連線且  Data source IS NULL,只好繼續看下去 ...

唯一最接近的就是備註內提到的 provider_name 是 [SQLNCLI] 項目:



真的是有看但沒有很懂。


目前只能推測當 data source (@datasrc) 如果沒有指定到時,預設會帶入 NULL,

而當 [OLE DB 提供者] 在初始化的過程當中,*可能*內部判斷若沒有資料來源時,

就會預設使用 本機/Localhost 來當作資料來源,而不會產生錯誤。


由於許多預設的行為無法深入查詢,只能先用腦補方式來想像推敲。

當 Linked Server 使用 IP 來命名時,若一時不察就會發生靈異現象了!

內外不合但行為正常且沒有錯誤,這才是真的令任摸不著頭緒。

真的處處都是坑,走過才知道 ....

預設值有時候很方便,但有時候卻很靈異

經過測試 3 個常用的 @provider 後發現,只有新的 MSOLEDBSQL 最正常,

沒有指定資料來源時,連線就會出現錯愕。

以下是結果

--導向自己
EXEC master.dbo.sp_addlinkedserver @server = N'8.8.8.8', @srvproduct=N'', @provider=N'SQLOLEDB'

--導向自己
EXEC master.dbo.sp_addlinkedserver @server = N'8.8.8.8', @srvproduct=N'', @provider=N'SQLNCLI'

--無法正常連線
EXEC master.dbo.sp_addlinkedserver @server = N'8.8.8.8', @srvproduct=N'', @provider=N'MSOLEDBSQL'


 

All rights reserved.



------------------------ 資料庫系統/AZURE/SQL Server/Oracle/Store Procedure/Function Database/C#/TSQL/SSMS/Azure DataStudio/ ------------------------

留言

這個網誌中的熱門文章

[工具] Excel 工具 - 檔案分拆|Excel File Splitting Into Small Files

[Linux] Ubuntu 安裝新酷音輸入法後,選字框不正常情況的解決方法

[分享] 設計模式速查表|23種設計模式類別圖 UML PDF檔案 | Design Pattern