Sql-Server

用於 Salesforce 的 ODBC 驅動程序:訪問 SSMS 中的連結伺服器對象

  • October 12, 2021

我在使用 SSMS 和 SQL Studio Management Studio (17.8.1) 中的 Devart ODBC Driver for Salesforce 使用我們的 MS SQL Server 2016(標準 64 位)訪問 Salesforce ODBC 數據源的連結伺服器時遇到問題。

如文件中所述,我在 SSMS 中創建了一個連結伺服器。

當我使用 64 位源時,僅在 SSMS 中測試****與ODBC 源的連接。當我使用 32 位 ODBC 源時,無法建立連接並顯示以下錯誤:

已創建連結伺服器,但連接測試失敗。無法為連結伺服器“SF”初始化 OLE DB 提供程序“MSDASQL”的數據源對象。連結伺服器“SF”的 OLE DB 提供程序“MSDASQL”返回消息“

$$ Microsoft $$$$ ODBC Driver Manager $$指定的 DSN 包含驅動程序和應用程序之間的體系結構不匹配”。(Microsoft SQL Server,錯誤:7303)

雖然我可以連接到 64 位源,但我無法訪問SQL Server Management Studio 17.x 中的連結伺服器對象(32 位 - 我相信沒有 SSMS 的 64 位版本):

當我嘗試展開伺服器對象樹視圖時,出現以下錯誤:

Select all Error: "Cannot obtain the schema rowset "DBSCHEMA_TABLES" for OLE DB provider "MSDASQL" for linked server

或者當我嘗試查詢某些內容時,例如SELECT TOP 1 * from SFDC...[Contact]

Cannot create an instance of OLE DB provider "MSDASQL" for linked server "SF". (Microsoft SQL Server, Error: 7302)

我嘗試了一些與錯誤 7302/3 相關的解決方案,但似乎沒有任何效果:

  • MSDASQL 提供程序:禁用允許程序內$$ this was required $$
  • 重啟(數據庫引擎甚至 Windows)
  • SQL Server 創建過程 sp_tables_info_rowset_64$$ does not fix the issue $$

我發現我確實可以連接到 Salesforce ODBC 源並使用第 3 方數據庫管理器(Database5Pro 64 位,SSMS 替代方案)訪問數據 - 但這不允許我同時訪問兩個數據源(沒有連結對象可用的)。

Devart 驅動程序要求(如安裝指南中所述,參見第 41 頁)所有移動元件的位數相同。

驅動程序、工作室和 SQL Server 的位數必須相同。

任何人都可以建議一種方法以類似 SSMS 的方式將 Salesforce 源用作連結伺服器以及 SQL Server 2016?我對替代解決方案和第 3 方工具持開放態度。

我還嘗試了舊版本的 SSMS(2012)和SQL Operations Studio的測試版(基本上是 SSMS 之類的 VS Code,實際上是 64 位應用程序),但無濟於事。

正如 Mark 猜測的那樣,這是一個權限問題,但並不那麼明顯。我不得不擺弄系統資料庫和 DCOM 配置。

我做了什麼:編輯 DCOM MSDANITIALIZE 安全設置和權限

這篇 MSDN 文章向我展示了解決問題的方法:Permissions required to setup linked server with out-of-process provider

必須在 MSDANITIALIZE 上設置某些權限,才能在程序外初始化提供程序並在本地和遠端成功執行連結伺服器查詢。(突出顯示由我添加)

當您得到時,顯然存在權限問題案例:Msg 7399, ... Access denied.但是如果基礎錯誤是 0x80070005,這也可能是 Msg 7301 和 7302 的根本原因。

0x80070005 - 本質上意味著訪問被拒絕。

另一個準備步驟…請參閱此 MSDN 部落格文章以供參考:SQL Server 連結伺服器上的 RPC 和 RPC Out 選項是什麼?

為了能夠執行連結伺服器查詢,還要在連結伺服器屬性 (SSMS) 上將RPC OUT 設置為 true

使用程序外提供程序設置連結伺服器所需的權限:

驗證 DCOMCNFG 中的以下設置:開始 -> 執行 -> Dcomcnfg

  1. 組件服務 -> 我的電腦 -> 屬性驗證是否設置了以下選項:

在“預設屬性”選項卡中:

* 選中“在這台電腦上啟用分佈式 COM”。 * 預設身份驗證 = 連接。 * 預設模擬級別 = 辨識或模擬。 2. 組件服務 ->我的電腦 -> DCOM 配置 -> MSDANITIALIZE

* 右鍵點擊MSDANITIALIZE -> 屬性 -> 安全 * 在“啟動和啟動權限”、“訪問權限”和“配置權限”下添加 SQL Server 服務帳戶(如果使用 SQL 登錄連接到 SQL Server)或 windows 使用者帳戶。 * 授予這些帳戶的全部權利。 * 重新啟動伺服器(在我的情況下不需要)

最後一步:

  1. 轉到 dcomcnfg > My computer > Properties > COM Security > Edit Defaults for Access Permissions & Launch and Activation Permissions,然後添加 SQL 代理帳戶(或特定使用者組…)。

如果您無法編輯 MSDANITIALIZE 的 DCOM 設置,則可能需要此準備步驟

  1. 獲取 MSDN 部落格的所有權HKEY_CLASSES_ROOT\AppID{2206CDB0-19C1-11D1-89E0-00C04FD7A829} :疑難解答“無法創建 OLE DB 提供程序的實例”

Oracle 的此說明進行比較:

  • 執行 (CTRL + R) dcomcnfg。導航到“組件服務 -> 電腦 -> 我的電腦 -> DCOM 配置”。
  • 打開 的屬性頁MSDAINITIALIZE。複製Application ID屬性頁上的。關閉。
  • 執行regedit。導航到HKEY_CLASSES_ROOT\AppID{???}使用Application ID上面獲得的“。
  • 右鍵點擊->權限-> 高級-> 所有者選項卡:將所有者更改為管理員。就我而言,管理員已經是所有者。
  • 返回權限:添加本地管理員組,應該執行客戶端的服務帳戶或使用者,授予他們完全控制權

只是為了完整…

  • 在 MSDN 論壇文章中,creffner 建議以管理員身份執行 SSMS。這並沒有解決我的問題。但這總是要嘗試的。
  • 重新啟動 SQL Server(引擎)$$ this was actually required $$

我將藉此機會提出一個答案,但在這種情況下,沒有具體的產品和設置,我當然無法驗證。我相信您需要做的是進入連結伺服器的安全設置並指定用於建立連接的特定帳戶。也就是說,在您要連接的伺服器上創建一個具有所需相應權限的帳戶,例如 SalesForceReader,並在您的連結伺服器中使用該帳戶和密碼。

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