web-dev-qa-db-ja.com

SQL Serverリンクサーバー:「このセッションではこれ以上トランザクションを開始できません。」

リンクサーバーに対してINSERT操作を実行しようとしています。

_DBCC TRACEON (3604, 7300)

BEGIN TRANSACTION

INSERT INTO LIVE.Contoso.dbo.Events (EventGUID, EventDate, LoginGUID, UserGUID, EventType, Notes, TargetGUID) 
VALUES ('{494D023F-CD5A-11E2-9F18-C86000D0B92A}', getdate(), '{3B4F90C0-CD5A-11E2-9F18-C86000D0B92A}', '{494D023D-CD5A-11E2-9F18-C86000D0B92A}', 1, N'Test notes', '{494D023E-CD5A-11E2-9F18-C86000D0B92A}')

ROLLBACK TRANSACTION
_

そしてそれはエラーを返します:

リンクサーバー "LIVE"のOLE DBプロバイダー "SQLNCLI"がメッセージ "このセッションではこれ以上トランザクションを開始できません。"を返しました。
メッセージ7395、レベル16、状態2、行3
ネストされたトランザクションを開始できませんOLEリンクサーバー "LIVE"のDBプロバイダー "SQLNCLI"。XACT_ABORTオプションがOFFに設定されていたため、ネストされたトランザクションが必要でした。

このローカルデータベースは、2000(クエリが機能する場所)から2005(クエリが機能しない場所)に移動されました。リモートサーバーは2008 R2です。

何を試しましたか?

網羅的なリスト 2年前に尋ねたこの質問から

リンクサーバーをどのように作成しましたか?

_--EXEC master.dbo.sp_dropserver @server = N'LIVE'
EXEC master.dbo.sp_addlinkedserver @server = N'LIVE', @srvproduct=N'', @provider=N'SQLOLEDB', @datasrc=N'vader'
EXEC master.dbo.sp_addlinkedsrvlogin @rmtsrvname = N'LIVE', @locallogin = NULL, @useself = N'False', @rmtuser = N'Contoso', @rmtpassword = N'Battery Horse Staple Correct'
_

しかし、何を試しましたか?

  • 両方のサーバーですべてのMSDTCセキュリティオプションを無効にしました

    enter image description here

  • クロックが同期していることを確認しました(不明な理由により、同期がとれていない場合、さまざまな認証スキームが壊れます)

    enter image description here

  • 両方のサーバーでファイアウォールを無効にしました(スクリーンショットはありません。あなたは私を信頼する必要があります)

  • ドメインに再び参加する

サーバーのバージョンは何ですか?

  • LocalMicrosoft SQL Server 2005 - 9.00.1399.06 (Intel X86) Oct 14 2005 00:33:37 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
  • リンクされたリモートMicrosoft SQL Server 2008 R2 (SP2) - 10.50.4000.0 (X64) Jun 28 2012 08:36:30 Copyright (c) Microsoft Corporation Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)
3
Ian Boyd

から SET XACT_ABORTのドキュメント

ほとんどのOLE DBプロバイダー(SQL Serverを含む)に対して暗黙的または明示的なトランザクションのデータ変更ステートメントに対してXACT_ABORTをONに設定する必要があります。このオプションが不要なのは、プロバイダーがネストされたトランザクションをサポートしている場合のみです。 」

おそらく、2000年にネストされたトランザクションをサポートするプロバイダーを使用していました。XACT_ABORTを設定する必要があるようです。ただし、これが本番用コードの動作と一致するかどうかはわかりません。

この回答が役立つ場合があります: ストアドプロシージャで「SET XACT_ABORT ON」を使用する利点は何ですか?

4
Sam