0

У меня есть две базы данных A и B. Они оба хранятся в одном экземпляре базы данных. Я создал связанный с петлей сервер на экземпляре.Сделка с соединением с обратной связью с обратной связью

База данных A содержит одну таблицу dbo.Users и одну хранимую процедуру, обновляющую dbo.Users таблицу. В базе данных B У меня есть запрос, который делает две вещи:

  1. выполнение хранимой процедуры из базы данных A которая обновляет dbo.Users таблицу.
  2. Выберите данные из dbo.Users через связанный сервер.
BEGIN TRANSACTION 
EXEC [LinkedServer].A.dbo.UpdateUser 
select * from [LinkedServer].A.dbo.Users 
ROLLBACK TRANSACTION 

Когда я пытаюсь выполнить эту хранимую процедуру, я получаю следующее исключение только тогда, когда я поставил тайм-аут на связанном сервере; в других случаях запрос не заканчивается:

Msg 3971, Level 16, State 1, Line 1 
The server failed to resume the transaction. Desc:3900000002. 

Причина этой проблемы заключается в том, что выполнение хранимой процедуры [LinkedServer].A.dbo.UpdateUser создает транзакцию, которая не позволяет сделать отборное заявление.

Так что я решил добавить WITH (NOLOCK), как показано ниже:

BEGIN TRANSACTION 
EXEC [LinkedServer].A.dbo.UpdateUser 
select * from [LinkedServer].A.dbo.Users WITH (NOLOCK) 
ROLLBACK TRANSACTION 

Тогда я получаю это исключение:

OLE DB провайдер "SQLNCLI11" для связанного сервера "LinkedServer" возвращается сообщение «Неизвестная ошибка ».
Поставщик OLE DB «SQLNCLI11» для связанный сервер «LinkedServer» возвращенное сообщение «Тайм-аут запроса истек».
Msg 7311, уровень 16, состояние 2, строка 4 Не удается получить схему набор строк «DBSCHEMA_TABLES_INFO» для поставщика OLE DB «SQLNCLI11» для связанного сервера «LinkedServer». Поставщик поддерживает интерфейс, но возвращает код сбоя, когда он используется.

Я нашел информацию об этом исключении на microsoft support page. Существует информация о том, что эта ошибка возникает при попытке запуска распределенных запросов с 64-разрядного клиента SQL Server на связанный 32-разрядный SQL Server. В моем случае это не имеет смысла, потому что у меня есть связанный loopback-сервер.

Приведенные выше ошибки не возникают при развертывании баз данных на отдельных экземплярах SQL-сервера. Любые идеи о том, как опустить блокировки или изменить T-SQL, чтобы не получить исключения при использовании связанного с петлей сервера?

+0

Нужна ли вам ссылка на связанный сервер? Почему бы не ссылаться на другую базу данных «database_name.schema_name.table_name'? –

ответ

1

OLE DB провайдер "SQLNCLI11" для связанного сервера "LinkedServer" возвращается сообщение "Неизвестная ошибка".

Поставщик OLE DB «SQLNCLI11» для связанного сервера «LinkedServer» возвращенное сообщение «Истекло время ожидания запроса».

Msg 7311, уровень 16, состояние 2, строка 4 Не удалось получить набор строк схемы "DBSCHEMA_TABLES_INFO" для поставщика OLE DB "SQLNCLI11" для связанного сервера " LinkedServer". Поставщик поддерживает интерфейс, но возвращает код сбоя, когда он используется.

Я также столкнулся с вышеупомянутой ошибкой.

Если вы выполняете обратную связь с обратным соединением и получаете ту же ошибку, убедитесь, что в конце сценария должен быть записан любой SP с использованием сервера обратной связи (Create Procedure).

Если вы используете код из TFS, напишите инструкцию процедуры создания этого SP, используя обратный сервер, связанный с обратной связью, в пост-развертывании.

Просто следуйте любому из указанных ниже действий: -

  1. Скопируйте и вставьте СП в конце сценария. OR
  2. Не используйте сервер обратной петли. OR OR
  3. Если вы используете опубликовать сценарий из TFS написать SP в сценарии развертывания Post (после ввода данных во всю таблицу).

Эти решения работали для меня.

Смежные вопросы