Я пытаюсь выполнить SQL на связанном сервере, но получаю ошибки.
BEGIN DISTRIBUTED TRANSACTION
SELECT TOP 1 * FROM Sessions
OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
Msg 7391, Level 16, State 2, Line 3
The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
Есть две ошибки, возвращаемые провайдером:
Ошибка #1:
Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: OLE DB provider "SQLNCLI" for linked server "ASILIVE" returned message "No transaction is active.".
HelpFile:
HelpContext: $00000000
SQLState: 01000
NativeError: 7412
Ошибка #2
Number: $80040E14
Source: Microsoft OLE DB Provider for SQL Server
Description: The operation could not be performed because OLE DB provider "SQLNCLI" for linked server "ASILIVE" was unable to begin a distributed transaction.
HelpFile:
HelpContext: $00000000
SQLState: 42000
NativeError: 7391
Как заставить Microsoft предпочесть функциональность безопасности?
Или, по крайней мере, как заставить два SQL Severs разговаривать друг с другом?
(null)
)То, что я сделал, не имеет отношения к делу, но я все равно это опубликую.
Убедитесь, что служба Distributed Transaction Coordinator
запущена на обеих машинах:
Отключите всю безопасность MSDTC на обеих машинах:
Включите случайные опции на связанном сервере:
Проклинал и ругался.
Разбил вещи.
Проверил, что SELECT
может использовать связанный сервер:
SELECT * FROM ASILive.CustomerManagementSystem.dbo.Users
....
(затронуто 763 строки)
Проверено, что клиентский сервер может пинговать
удаленный сервер:
C:\Documents and Settings\avatar>ping asicmstest.contoso.com
Pinging asicmstest.contoso.com [10.0.0.40] с 32 байтами данных:
Ответ от 10.0.0.40: bytes=32 time<1ms TTL=128
Ответ от 10.0.0.40: bytes=32 time<1ms TTL=128
Ответ от 10.0.0.40: байты=32 время<1мс TTL=128
Ответ от 10.0.0.40: байты=32 время<1мс TTL=128
Статистика пинга для 10.0.0.40:
Пакеты: Отправлено = 4, Получено = 4, Потеряно = 0 (0% потерь),
Приблизительное время обхода в миллисекундах:
Минимальное = 0 мс, Максимальное = 0 мс, Среднее = 0 мс.
Проверил, что удаленный сервер может общаться обратно, по имени, с инициирующим сервером:
C:\Documents and Settings\avatar>ping asitestserver.contoso.com
Pinging asitestserver.contoso.com [10.0.0.22] с 32 байтами данных:
Ответ от 10.0.0.22: bytes=32 time<1ms TTL=128
Ответ от 10.0.0.22: bytes=32 time<1ms TTL=128
Ответ от 10.0.0.22: байты=32 время<1мс TTL=128
Ответ от 10.0.0.22: байты=32 время<1мс TTL=128
Статистика пинга для 10.0.0.22:
Пакеты: Отправлено = 4, Получено = 4, Потеряно = 0 (0% потерь),
Приблизительное время обхода в миллисекундах:
Минимальное = 0 мс, Максимальное = 0 мс, Среднее = 0 мс.
Проверил, что @@SERVERNAME
совпадает с именем сервера на обоих серверах:
SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
------------- -------------
ASITESTSERVER ASITESTSERVER
и
SELECT @@SERVERNAME, SERVERPROPERTY('MachineName')
---------- ----------
ASIGROBTEST ASIGROBTEST
Закричал
Выдал SET XACT_ABORT ON
перед выдачей моего запроса:
SET XACT_ABORT ON
GO
НАЧАТЬ РАСПРЕДЕЛЕННУЮ ТРАНЗАКЦИЮ
SELECT TOP 1 * FROM Sessions
Granted Everyone
Full Control
to:
HKEY_LOCAL_MACHINE\Software\Microsoft\MSSQLServer
на обоих серверах.
Я получал ту же ошибку, и я сумел решить ее путем конфигурирования MSDTC правильно на исходном сервере для разрешения исходящий и позволил DTC через брандмауэр окон.
Позволяют Distributed Transaction Coordinator, отмечают домен, частные и общедоступные опции