Linux系統下的SQL Server不支援其他型別資料來源的連結伺服器

cow977發表於2019-12-14

客戶需求:一臺Ubuntu伺服器,安裝SQL Server 2017資料庫,作為中間伺服器,透過SQL Server的連結伺服器方式,連線各業務系統的相關資料庫。

問題:有一個系統的資料庫採用的是Oracle資料庫,建立了連結伺服器後,在引用時報“ 尚未註冊OLD DB訪問介面 OraOLEDB.Oracle ”錯誤。

親自測試,首先透過GUI方式建立連結伺服器,目標伺服器型別只能選擇“SQL Server”,“其他資料來源”選項是灰色不可選狀態。

詢問客戶系統中的連結伺服器建立方式,告知是透過SQL命令建立的。

USE [master]

GO

EXEC master.dbo.sp_addlinkedserver

     @server = N'OracleData'

   , @srvproduct=N'ORACLE'

   , @provider=N'OraOLEDB.Oracle'

   , @datasrc=N'TNS_NAME'

EXEC master.dbo.sp_addlinkedsrvlogin

     @rmtsrvname= N'OracleData', @useself=N'False', @locallogin=NULL

   , @rmtuser=N'OraUser', @rmtpassword='OraPassword'

GO

 

select * from OracleData..OraUser.UserTable

go

 

訊息 7403,級別 16,狀態 1,第 1 行

尚未註冊 OLE DB 訪問介面 "OraOLEDB.Oracle"。

按照Windows系統下的習慣思路,只要安裝Oracle資料庫的相應驅動就能解決問題。

首先安裝Oracle客戶端程式和工具,具體操作見前文:

http://blog.itpub.net/81227/viewspace-2668066/

透過sqlplus工具測試,可以連線上Oracle資料庫。

測試連結伺服器,還是報原來的錯誤。

透過直接方式不能解決問題,那是否能透過ODBC方式解決問題呢?雖然ODBC要比直接方式效率要低,效能要差,但能解決問題總歸是好的。

安裝unixODBC方法,參見:

http://blog.itpub.net/81227/viewspace-2668511/

透過isql工具測試,同樣連線上了Oracle資料庫。

再次測試連結伺服器,問題依舊。

不能解決問題,總要給客戶一個交待的,不然就顯得自己太不專業了。

只能從MicroSoft的官方文件中找答案。

終於,在MicroSoft的一篇名為“Editions and supported features of SQL Server 2017 on Linux”的文件( -editions-and-components-2017?view=sql-server-ver15 ) 中找到了答案, Linked Servers to data sources other than SQL Server (Linux 版本的SQL Server 2017不支援除SQL Server外的其他資料來源的連結伺服器)。

總算能給客戶一個交待了。

其實,到目前為止,Linux版本的SQL Server 2019也同樣不支援。不過,在SQL Server 2019中,提供了另一種稱為PolyBase的技術解決了在SQL Server中訪問其他型別資料來源的問題。

 

坑1:透過SQL命令方式執行建立連結伺服器時,不檢查資料來源型別的合法性;

USE [master]

GO

EXEC master.dbo.sp_addlinkedserver

     @server = N'OracleData1'

   , @srvproduct=N'ORACLE'

   , @provider=N'unixODBC'

   , @datasrc=N'DSN_NAME'

EXEC master.dbo.sp_addlinkedsrvlogin

     @rmtsrvname= N'OracleData', @useself=N'False', @locallogin=NULL

   , @rmtuser=N'OraUser', @rmtpassword='OraPassword'

GO

 

USE [master]

GO

EXEC master.dbo.sp_addlinkedserver

     @server = N'OracleData2'

   , @srvproduct=N'ORACLE'

   , @provider=N'MSDASQL'

   , @datasrc=N'TNS_NAME'

EXEC master.dbo.sp_addlinkedsrvlogin

     @rmtsrvname= N'OracleData', @useself=N'False', @locallogin=NULL

   , @rmtuser=N'OraUser', @rmtpassword='OraPassword'

GO

 

資料來源型別無論改成何種型別,建立時均不報錯,連結伺服器建立成功。

坑2:系統不支援其他型別的資料來源,但錯誤提示卻是“訪問介面未註冊”,而不是明確提示系統不支援此型別資料來源;

select * from OracleData1..OraUser.UserTable

go

 

訊息 7403,級別 16,狀態 1,第 1 行

尚未註冊 OLE DB 訪問介面 "unixODBC"。

 

select * from OracleData2..OraUser.UserTable

go

 

訊息 7403,級別 16,狀態 1,第 1 行

尚未註冊 OLE DB 訪問介面 "MSDASQL"。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/81227/viewspace-2668645/,如需轉載,請註明出處,否則將追究法律責任。

相關文章