再遇到加裝 Oracle Client 其他版本後 ODP.NET 壞掉的案例,已不是第一次發生,但沒能歸納出明確規則,故留個記錄。

問題主機是 Windows Server 2016,原本已經裝好 Oracle Client 11.2 及 12.1 的 32 位元版本。但因為上面有 SQL Server 需要連 Oracle Linked Server,故需加裝 64 位元版 Oracle Provider for OLE DB

安裝 Oracle Client 12.1 x64 並重開機後,Oracle Linked Server 功能正確啟用。但不久後接到回報,該主機上跟 Oracle 查詢有關的網站全部壞光光!

早上還是好的,肯定剛才不知哪個渾球做了什麼把它搞壞! 嗯,真相只有一個,兇手就是 -- 我!

錯誤訊息並不一致,有趣的是連不依賴 Oracle Client 的 Managed ODP.NET 也冒出 ORA-12154: TNS:could not resolve the connect identifier specified. 錯誤,Unmanaged ODP.NET 則是冒出 The provider is not compatible with the version of Oracle client

Managed ODP.NET 出現無法解析名稱應與 TNSNAMES.ORA 有關,檢查 TNS_ADMIN 環境變數與其所指位置,確定檔案存在無誤。(Managed ODP.NET TNSNAMES.ORA 尋找原則可參考介紹文章文末說明以及實務案例)

另我也用 ASP.NET /bin 組件載入跟你想的不一樣文章裡 Inline ASPX 印出 typeof(Oracle.DataAccess.Client.OracleConnection).Assembly.CodeBase; 的技巧檢查網站,Unmanaged ODP.NET 版本是 11.2 32 位元版本沒錯,理論上不該發生 Oracle Client 版本不相容。

拳腳招式用盡,該放大絕了 - 祭出 Process Monitor,茶包立刻現形!

如上圖所示,ODP.NET 試圖存取 oci.dll 及 OraOps11w.dll 遇上 ACCESS DENIED 吃了閉門羹,無法取得該版本所需的程式庫,是導致The provider is not compatible with the version of Oracle client錯誤的原因。而 Managed ODP.NET 無法解析連線主機,應該也是讀取 TNSNAMES.ORA 權限被拒造成。

對 product\xxx\client_1\ 資料夾套用 Authenticated User 讀取權限後問題排除(記得要套用覆寫每個檔案,只改資料夾有時無效,做完記得 IISRESET)。

而類似案例之前發生過:

由於網站設定並未變動,先前可以執行代表原本有開權限,為什麼安裝64位元Oracle Client會變更32位元Oracle Client目錄的權限,則是個謎。但在經驗中,因為Oracle Client目錄權限出錯已不是第一次,相信也不是最後一次。

重新下結論:

  1. 加裝 Oracle Client 時可能會更動原先安裝 Oracle Client 目錄的權限,把原本好好的網站或程式搞壞
  2. 可能出現的錯誤包含但不限於:
    • ORA-12154: TNS:could not resolve the connect identifier specified.
    • The provider is not compatible with the version of Oracle client
    • An attempt was made to load a program with an incorrect format
  3. 凡遇加裝 Oracle Client 害舊網站/程式壞掉,先拆座墊先檢查權限

Summary of errors you may ecounter after installing additional Oracle client and checking SOP.


Comments

Be the first to post a comment

Post a comment