Назад | Перейти на главную страницу

Связанный сервер 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

и возвращает ошибку:

Поставщик OLE DB «SQLNCLI» для связанного сервера «LIVE» вернул сообщение «Невозможно запустить больше транзакций в этом сеансе».
Msg 7395, уровень 16, состояние 2, строка 3
Невозможно запустить вложенную транзакцию для поставщика OLE DB «SQLNCLI» для связанного сервера «LIVE». Требуется вложенная транзакция, поскольку для параметра XACT_ABORT было установлено значение OFF.

Эта локальная база данных была перенесена с 2000 года (когда запросы работали) на 2005 год (где запросы не работали). Удаленный сервер - 2008 R2.

Что ты пробовал?

Исчерпывающий список вещей из этого вопроса, который я задал два года назад.

Как вы создали связанный сервер?

--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'

Но что вы пробовали?

Какие версии серверов?

Из документация SET XACT_ABORT:

XACT_ABORT должен быть установлен в ON для операторов изменения данных в неявной или явной транзакции с большинством поставщиков OLE DB, включая SQL Server. Единственный случай, когда эта опция не требуется, - это если провайдер поддерживает вложенные транзакции ».

Возможно, вы использовали провайдера, который поддерживал вложенные транзакции в 2000 году. Похоже, вам нужно установить XACT_ABORT. Не уверен, что это соответствует тому, что делает ваш производственный код.

Этот ответ может помочь: В чем преимущество использования «SET XACT_ABORT ON» в хранимой процедуре?