無法從 SQL Server 2014 上的連結伺服器更新 MySQL 表
我正在使用 SQL Server 2014,它帶有一個連結到 AWS 上的 MySQL 數據庫的伺服器。我需要使用另一個連結伺服器上存在的數據更新該連結伺服器上的行。如果這還不夠複雜,我需要將伺服器和數據庫名稱參數化,這樣我就可以輕鬆配置我的 SQL Server 代理作業以針對測試或產品執行……所以一切都是動態 SQL。
我試過這個:
exec (@remoteSql);
where
@remoteSql
包含一個有效的openquery
更新語句。這會導致此錯誤:連結伺服器“AWS”的 OLE DB 提供程序“MSDASQL”無法更新表“
$$ MSDASQL $$"。行集正在使用樂觀並發,並且在包含行最後一次獲取或重新同步後,列的值已更改。
所以我嘗試了這個:
declare @remoteSql nvarchar(max); declare c cursor for select RemoteSql from @updates; open c; fetch next from c into @remoteSql; while @@fetch_status = 0 begin exec (@remoteSql) at AWS; fetch next from c into @remoteSql; end; deallocate c;
where
@updates
包含少量記錄,並@remoteSql
包含一個完全有效且相當簡單的update
語句(沒有連接,只有 3 個欄位和一個 where 子句),可以在 MySQL 上執行。這會因這個非常有用的錯誤消息而炸毀:無法在遠端伺服器“AWS”上執行語句。
如果我接受語句,轉義雙引號並 go
exec ('update ... where ...') at AWS;
,我會得到同樣的錯誤,這在此處有效。我在我的 ODBC 數據源上選中了返回匹配行而不是受影響的行複選框,並四重檢查了我的連結伺服器是否啟用了 RPC。
同一個儲存過程有一個相當複雜的動態 SQL
update
語句,涉及到本地表的連接和通過 連接到另一個遠端表的連接openquery
,並且該儲存過程完美地工作-但是對於該表,相同的方法失敗了。為什麼它拒絕更新該遠端表(我正在使用的登錄名確實具有必要的權限),我還能嘗試什麼?
配置 MSDASQL 提供程序
我相信以下應該解決它。為 SQL Server 的 MSDASQL 提供程序啟用以下功能:
AllowInProcess IndexAsAccessPath LevelZeroOnly DynamicParameters NestedQueries
其他似乎可行的選項是創建主鍵:
https://www.sqlservercentral.com/Forums/657910/OPENQUERY-UPDATE-problem-with-MySQL-as-linked-server
留給後代,因為沒有人想到這一點。
如果其他一切看起來都正確,請確認您沒有更新由更新觸發器自動更新的列。
不確定 MySQL 是如何實現其觸發器的,但在我的情況下,這就是讓它自行跳閘的原因,並發出一個非常誤導性的錯誤消息。