[靈異事件簿] MS SQL Server Linked Server 資料源為空白時的異常行為 | Strange behavior of SQL Server Linked Server When Data Source Is Null
某日同事回報 SQL 從遠端抓取資料的時候怪怪的,
目前只能推測當 data source (@datasrc) 如果沒有指定到時,預設會帶入 NULL,
而當 [OLE DB 提供者] 在初始化的過程當中,*可能*內部判斷若沒有資料來源時,
透過 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] 項目:
真的是有看但沒有很懂。
而當 [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.
留言