SSMS UI 無法正常顯示連結伺服器(Linked Server)的資料庫清單

日前幫同仁建立Linked Server的介接權限,設定完成後,同仁透過SSMS來展開該Linked Server,想檢視一下該Server的資料庫清單,但詭異的是她展開後發現SSMS UI沒有顯示任何的資料庫。

但用TSQL去抓取該Linked Server資料的確是OK的。這狀況不太符合以前經驗法則,印象中SSMS會列出該Linked Server中你有權限檢視的資料庫,故花了一點時間研究一下,終於可以重現該狀況,在此簡單紀錄一下。

我先在資料庫主機建立一個ODBC的資料源叫做SQLB。

 

隨後我們打開SSMS UI來建立一個新的Linked Server連結,如下圖我們提供者選擇ODBC Driver,然後資料源就是剛剛那個SQLB。

 

Linked Server連結的安全性就如下圖。

 

伺服器選項如下圖所示(基本上這邊設定不會影響實驗結果)。

 

完成上述設定後我們可以看見SSMS的UI顯示我們剛剛建立出來的Linked Server叫SERVER_B。

 

接下來我們建立一個SQL帳號叫做rock。

 

我們用rock帳號登入後,我們試著展開SERVER_B圖示,如下圖我們發現空空如也,SSMS顯示SERVER_B下面沒有任何DB。(注意,我的rock帳號在SERVER_B也有相同帳密且有權限登入)

 

這時我們將rock這一個帳號加入sysadmin群組,看看會有甚麼變化。

 

在將rock這一個帳號加入sysadmin群組後,我們重整一下SSMS的UI後展開SERVER_B圖示,如下圖所示SSMS顯示SERVER_B下面所有的DB了。

 

至於為什麼只有在rock是sysadmin才會秀出SERVER_B的資料庫,不是sysadmin就顯示空白。第一時間想到就是權限問題,至於是甚麼權限問題就只能看在SSMS UI在展開SERVER_B圖示時跑了那些SQL語法。這時就開啟Profiler來抓取執行的語法。下圖就是我們抓取到的部分語法,也就是這個語法讓rock不是sysadmin角色時就無法顯示出SERVER_B的資料庫。

 

關鍵就在這個資料庫物件master.dbo.xp_prop_oledb_provider,展開SERVER_B圖示時會呼叫xp_prop_oledb_provider,而這物件當rock權限不足時是無法執行,因此SSMS UI就無法顯示SERVER_B中的資料庫清單。但是一但將rock加入sysadmin後,由於rock有足夠權限去執行xp_prop_oledb_provider所以便能順利的列出SERVER_B中的資料庫清單了。

 

[重要]會有上述狀況僅限於連線該Linked Server時使用的Provider不是走SQLNCLI 或 MSOLEDBSQL。像我建立SERVER_B是用OS的ODBC資料源,而這會讓SQL使用MSDASQL這個Provider,因此要展開SERVER_B圖示時會觸發執行xp_prop_oledb_provider去抓一些資訊,而這動作一但權限不足就無法正常列出資料清單了。

我是ROCK

rockchang@mails.fju.edu.tw