Sql-Server

配置從 SQL Server 2016 到 Oracle 12c 的新連結伺服器

  • June 10, 2020

我在 SQL Server 2016 中創建連結伺服器以與遠端 Oracle 數據庫通信時遇到困難。

我已經安裝了 Oracle 數據庫客戶端 12c。首先我安裝了 InstantClient,然後我意識到我需要更多的功能安裝執行時。在安裝過程中,我接受C:\Oracle\product\12.1.0\client_1了 Oracle 主目錄。對於 Oracle Home 使用者,我使用了 Windows 內置帳戶NT AUTHORITY\LOCAL SERVICE

我使用 Oracle Net Configuration Assistant 創建了一個帶有 alias =MyAlias和 service name =的 tnsnames.ora 文件MyServiceName。在我為遠端數據庫提供憑據後,Net Configuration Assistant 能夠成功測試數據庫連接。

Oracle Net Configuration Assistant 創建的 tnsnames.ora 文件位於以下文件夾中:C:\Oracle\product\12.1.0\client_1\network\admin

在 Powershell 提示符下,我執行tnsping MyAlias並得到了OK (200 msec).

我認為(希望!)這意味著我得到了 Oracle 方面的正確性。

在 Microsoft 方面,我安裝了 .NET Framework 3.5。然後我從這裡下載並安裝了 Oracle 數據訪問組件 (ODAC) 。具體來說,我下載了 ODAC122010Xcopy_x64.zip並按照包含的自述文件中的說明進行操作。我在安裝過程中使用的命令行選項是:

.\install.bat all c:\oracle odac true true

上述命令的參數為:

  • component_name = all(安裝所有 Oracle Providers)
  • oracle_home_path = c:\oracle(應該是 Oracle 基礎文件夾還是子文件夾?)
  • oracle_home_name = odac(確定系統資料庫項路徑)
  • install_dependents =true
  • machine_wide_configuration = true(這個參數是一個猜測;我希望它適用於這台機器的所有使用者)

然後我將 C:\oracle 和 C:\oracle\bin 添加到環境變數 PATH 的開頭。在 Powershell 中,這是:

[Environment]::SetEnvironmentVariable("Path","C:\oracle;C:\oracle\bin;" + $env:Path, [System.EnvironmentVariableTarget]::Machine)

在 SQL Server Management Studio 中,我可以在連結伺服器提供程序列表中看到 OraOLEDB.Oracle。

現在嘗試創建連結伺服器。這是我的配置:

SSMS 連結伺服器嚮導的螢幕截圖

為了安全起見,我現在正在嘗試使用固定的安全上下文,使用在測試與 Oracle Net Configuration Assistant 的連接時有效的相同憑據。

它不起作用。這是一般錯誤:

已創建連結伺服器,但連接測試失敗。您要保留連結伺服器嗎?

無法為連結伺服器“MYLINKEDSERVER”初始化 OLE DB 提供程序“OraOLEDB.Oracle”的數據源對象。連結伺服器“MYLINKEDSERVER”的 OLE DB 提供程序“OraOLEDB.Oracle”返回消息“ORA-12154:TNS:無法解析指定的連接標識符”。(Microsoft SQL Server,錯誤:7303)

我錯過了什麼?哪些診斷測試有價值?

嘗試將您的數據源和提供者字元串更改為 MYALIAS。查看我的伺服器上的三個 Oracle 連結伺服器,這就是我設置它們的方式。在此處輸入圖像描述

我今天在我的 MS SQL 2016 和 oracle 12c 上檢查了它,並且工作正常。

您不需要 oracle 即時客戶端 - 只有 oracle ole db 提供程序和tnsnames.ora

你必須set "TNS_ADMIN=C:\oracle\network\admin""ORA_CLIENT_PATH=C:\oracle" and add "c:\oracle;c:\oracle\bin"PATH

在“連結伺服器”設置中,您必須使用來自tnsname.ora. “產品名稱”可以為空

羅爾夫

引用自:https://dba.stackexchange.com/questions/240085