Sql-Server

使用 OPENQUERY 更新連結伺服器(普遍數據庫)失敗

  • July 15, 2019

我有 2 個數據庫伺服器:

ServerA:Windows Server 2012 R2 標準版、SQL Server 2014 (SP3) (KB4022619) 標準版。

ServerB:Windows Server 2016 Datacenter、SQL Server 2016 (SP2-CU6) (KB4488536) 企業版

兩者都是位於不同 DC、不同域下的 x64 伺服器。

目的:

我們計劃將生產數據庫從 ServerA 遷移到 ServerB。

採取的行動: 在遷移生產數據庫之前,我想先在開發環境中驗證它。所以,

所有數據庫、連結伺服器(具有類似設置)、登錄名等都已從 ServerA 正確複製到 ServerB。

在 ServerB 上安裝 Pervasive 數據庫的 ODBC 驅動程序(類似於 ServerA)。

將所有系統 DSN 從 ServerA 導出到 ServerB。

更新了 ServerB 上的 MSDTC 設置(類似於 ServerA)。

注意:連結伺服器是指普遍數據庫。

面臨的問題;

在所有這些使用者都能夠登錄、數據庫可以訪問、報告正在執行並且伺服器(ServerB)執行良好之後,使用者就可以使用連結伺服器從 Pervasive 數據庫中選擇表。

但問題是,“使用者無法使用 ServerB 上的連結伺服器對普遍數據庫執行更新。

更新查詢第 1 次和第 2 次失敗並出現相同的錯誤:

--1------------------------------------------------------------
UPDATE OPENQUERY (LinkedServerName, 'SELECT Column_1,Column_2,Column_3,Column_4 FROM TableName WHERE Column_3 = 5910 AND Column_4 = 2')
SET Column_1='2019-02-01',Column_2='2019-07-01';
--2------------------------------------------------------------
UPDATE OQ
SET Column_1='2019-02-01',Column_2='2019-07-01'
FROM OPENQUERY (LinkedServerName, 'SELECT * FROM TableName') OQ
WHERE Column_3 = 5910 AND Column_4 = 2;

錯誤1:

Msg 7399, Level 16, State 1, Line 4
The OLE DB provider "MSDASQL" for linked server "LinkedServerName" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7343, Level 16, State 4, Line 4
The OLE DB provider "MSDASQL" for linked server "LinkedServerName" could not UPDATE table "[MSDASQL]". Unknown provider error.

第三次查詢的錯誤退出不同。

UPDATE LinkedServerName.DBName..TableName
SET Column_1='2019-02-01',Column_2='2019-07-01'
WHERE Column_3 = 5910 AND Column_4 = 2;

錯誤2:

Msg 7399, Level 16, State 1, Line 26
The OLE DB provider "MSDASQL" for linked server "LinkedServerName" reported an error. The provider reported an unexpected catastrophic failure.
Msg 7343, Level 16, State 4, Line 26
The OLE DB provider "MSDASQL" for linked server "LinkedServerName" could not UPDATE table "[LinkedServerName].[Database]..[TableName]". Unknown provider error.

相同的查詢在 ServerA 上成功執行。

解決方案將不勝感激。

謝謝!

此問題是由於將 SQL Server 從 SQL2014 升級到 SQL2016 或更高版本引起的。用於 ODBC 驅動程序的 Microsoft OLE DB 提供程序已更改。它現在支持更多 ISO 和其他 ODBC 功能。這是一些 ODBC 連接的重大更改。

此驅動程序 ( MSDASQL ) 用於在伺服器上包裝 ODBC 連接,在這種情況下,連接到普遍數據庫,並允許它充當連結伺服器。包裝器允許 OPEN Query 功能以及標準的連結查詢呼叫。

更改的問題在於,如果您使用 ODBC 驅動程序版本 11或更低版本進行查詢活動,則新包裝器正在發送未處理的額外數據。它無法處理附加資訊,並會在執行時返回錯誤。但是,它將能夠連接。

普遍的 ODBC 驅動程序版本 12僅適用於查詢,但 Open Query 將不起作用。您將繼續在打開查詢更新時遇到“意外的災難性故障”。

我建議您升級到 13.3 版。 Actian 的此版本將支持選擇和更新,並將解決 Open Query 錯誤。我不知道您是否需要 Actian 的支持來獲得驅動程序的許可。

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