SQL Server 2019からSQL Server 2005へのリンクサーバ経由でアクセスするプロシージャーでエラーが発生した。
SQL ServerにSSMSでアクセスしてみると、リンクサーバーは存在する。リンクサーバーへの接続も問題なし。Select文でもリンクサーバー先のテーブルを参照できる。プロシージャーを実行すると、OLEDBのエラーが表示される。
リンク サーバー "サーバ名" の OLE DB プロバイダー "MSOLEDBSQL" から、メッセージ "トランザクションは既に暗黙的または明示的に、コミットまたは中止されています。" が返されました。
メッセージ 7391、レベル 16、状態 2、プロシージャ dbo.プロシージャー名、行 99 [バッチ開始行 2]
リンク サーバー "サーバ名" の OLE DB プロバイダー "MSOLEDBSQL" で分散トランザクションを開始できなかったので、この操作を実行できませんでした。
リンク サーバー "サーバ名" の OLE DB プロバイダー "MSOLEDBSQL" で分散トランザクションを開始できなかったので、この操作を実行できませんでした。
状況をまとめると・・・
- SQL Server 2005もSQL Server 2019も稼働している。
- もともとはプロシージャーも正常に実行できていた。
- リンクサーバーの接続確認は問題なし
- Select文などを発行すると、正常にリンクサーバーのテーブルにアクセスできる。(Viewでも同様)
- プロシージャーは、失敗する。
- 分散トランザクションの設定はちゃんとできている(もともとは成功していた)。
- リンクサーバーの接続で使用するユーザはアクティブであり、パスワードも問題なし。
- 実行結果を見ていくと、ごくまれに成功しているときがある(SQL Serverへのコネクションは異なる)
いろいろと切り分けた結果、認証先?のAD(Active Directory)のOSバージョンによって、プロシージャーの実行が成功するか失敗するかが分かれていた。古いWindowsOSのADに問い合わせがいくと成功する。新しいOS(Windows Server 2022)だと失敗する。
Windows Server 2022のADに問い合わせされて、SQL Server 2005にアクセスされると、プロトコルとかセキュリティのキーセットの問題ではじかれて分散トランザクションが失敗して、タイムアウトになっているようだ。古いものは、互換性も無くなってきているので、きつい。