17

MyTable次のように、トリガーを定義したテーブルが呼び出されます。

CREATE TRIGGER dbo.trg_Ins_MyTable
   ON  dbo.MyTable 
   FOR INSERT
AS 
BEGIN
    SET NOCOUNT ON;

    insert SomeLinkedSrv.Catalog.dbo.OtherTable 
        (MyTableId, IsProcessing, ModifiedOn)
    values (-1, 0, GETUTCDATE())
END
GO

に行を挿入しようとすると、次のMyTableエラー メッセージが表示されます。

メッセージ 3910、レベル 16、状態 2、行 1 別のセッションで使用中のトランザクション コンテキスト。

リンク サーバーとして適切にSomeLinkedSrv定義しました (たとえば、select * from SomeLinkedSrv.Catalog.dbo.OtherTable問題なく動作します)。

エラーを回避し、レコードを正常に挿入してトリガーを実行するにはどうすればよいですか?

4

8 に答える 8

24

MARS が有効になっている場合、分散トランザクションでループバック リンク サーバーを使用することはできません。

ループバック リンク サーバーは、分散トランザクションでは使用できません。分散トランザクション内からループバック リンク サーバーに対して分散クエリを試行すると、エラー 3910 などのエラーが発生します: "[Microsoft][ODBC SQL Server Driver][SQL Server]Transaction context in use by another session." この制限は、複数のアクティブな結果セット (MARS) が有効になっていない接続によって発行された INSERT...EXECUTE ステートメントがループバック リンク サーバーに対して実行される場合には適用されません。接続で MARS が有効になっている場合でも、制限が適用されることに注意してください。

http://msdn.microsoft.com/en-us/library/ms188716(SQL.105).aspx

于 2012-05-22T15:27:56.560 に答える
1

私はそれを解決します。同じリンク サーバーを使用して 2 番目のプロシージャを呼び出し、次に同じリンク サーバーを使用していたプロシージャを呼び出しました。

リンクされたサーバーの制限を知っているだけで、とても簡単です。

于 2015-11-20T17:45:38.903 に答える
1

この状況の原因の 1 つは、リンク サーバー データベース テーブルに対して機能するトリガーです。データベースを処理する SQL-Server の SQL バージョンも重要です。SQLクエリの実行中にこのエラーを回避するには、更新されたテーブルのトリガーを一時的に無効にし、実行後に有効にする必要があります。すべてデータベース名チェック付き。次に例を示します。

     Select * From People  where PersonId In (@PersonId, @PersonIdRight)
     IF 'DOUBLE' = DB_NAME()
        ALTER TABLE [dbo].[PeopleSites] DISABLE TRIGGER [PeopleSites_ENTDB_UPDATE]

     Update PeopleSites Set PersonId = @PersonIdRight Where  PersonId = @PersonId

     IF 'DOUBLE' = DB_NAME()
        ALTER TABLE [dbo].[PeopleSites] ENABLE TRIGGER [PeopleSites_ENTDB_UPDATE]


     Select * From PeopleSites where PersonId In (@PersonId, @PersonIdRight)
于 2020-05-19T12:22:13.140 に答える
0

DEV環境でも同じエラーが発生し、リンクされたデータベースを別のSQLインスタンスに移動すると問題が解決しました。私たちの本番環境では、これらのデータベースはすでに別々のインスタンスにあります

于 2014-10-29T11:34:22.390 に答える
0

私の場合、SQL 2005 を使用していて、リンク サーバー上で Insert....exec を実行すると、「トランザクション コンテキストが別のセッションで使用されています」というメッセージが表示されました。私にとっての修正は、SP2 ビルド 3161 から SP3 にパッチを適用することでした。ただし、SP2累積5は修正されるはずです。

https://support.microsoft.com/en-us/kb/947486

于 2016-02-12T16:38:21.497 に答える
0

リモート データベースが同じサーバー上にある場合は、データベース サーバーの IP / ホスト名とポートを指定せずにリンク サーバーを構成します。データベース名だけで十分です。

于 2016-09-05T10:07:39.797 に答える