Подтвердить что ты не робот

Сервер MSDTC на сервере недоступен

Я получаю эту странную ошибку на SQL Server. И я не могу найти решение в более старых сообщениях.

У меня есть эта процедура:

create proc _upJM_SyncAll_test
as
begin
    DECLARE @SQLString nvarchar(max)

set @SQLString = N'
DELETE FROM OPENQUERY([LOCAL_MYSQL],''SELECT acSubject FROM _utjm_setitemprices'') where acSubject not in (select acSubject from _uvJM_SetSubj)
DELETE FROM OPENQUERY([LOCAL_MYSQL],''SELECT acSubject FROM _utjm_setsubj'') where acSubject not in (select acSubject from _uvJM_SetSubj)

update a
set acName2 = b.acName2,
    acName3 = b.acName3,
    acAddress = b.acAddress,
    acPost = b.acPost,
    acPostName = b.acPostName, 
    acCountry = b.acCountry, 
    acVATCodePrefix = b.acVATCodePrefix,
    acCode = b.acCode, 
    anDaysForPayment = b.anDaysForPayment
from OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') a join _uvJM_SetSubj b on (a.acSubject = b.acSubject)
where 1=1
and (   isnull(a.acName2,'''') <> isnull(b.acName2,'''') OR 
        isnull(a.acName3,'''') <> isnull(b.acName3,'''') OR 
        isnull(a.acAddress,'''') <> isnull(b.acAddress,'''') OR 
        isnull(a.acPost,'''') <> isnull(b.acPost,'''') OR 
        isnull(a.acPostName,'''') <> isnull(b.acPostName,'''') OR 
        isnull(a.acCountry,'''') <> isnull(b.acCountry,'''') OR 
        isnull(a.acVATCodePrefix,'''') <> isnull(b.acVATCodePrefix,'''') OR 
        isnull(a.acCode,'''') <> isnull(b.acCode,'''') OR 
        isnull(a.anDaysForPayment,'''') <> isnull(b.anDaysForPayment,'''')
)

insert into OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') (acSubject, acName2, acName3, acAddress, acPost, acPostName, acCountry, acVATCodePrefix, acCode, anDaysForPayment)
select b.acSubject, b.acName2, b.acName3, b.acAddress, b.acPost, b.acPostName, b.acCountry, b.acVATCodePrefix, b.acCode, b.anDaysForPayment
from OPENQUERY([LOCAL_MYSQL],''SELECT * FROM _utjm_setsubj'') a right join _uvJM_SetSubj b on (a.acSubject = b.acSubject)
where a.acSubject is null '

EXECUTE sp_executesql @SQLString;
end

Когда я запускаю процедуру в студии управления следующим образом:

  exec dbo._upJM_SyncAll_test

все в порядке. Я не получаю ошибки, синхронизация работает нормально.

Но когда я ставлю execute в триггере следующим образом:

create trigger _utrJM_SetSubj on tHE_SetSubj after insert, update, delete
as
begin
    exec dbo._upJM_SyncAll_test
end

Я получаю эту ошибку:

Msg 8501, уровень 16, состояние 3, процедура _upJM_SyncAll_test, строка 54
MSDTC на сервере "сервер" недоступен.

Процедура _upJM_SyncAll_test имеет только 39 строк...

4b9b3361

Ответ 1

Триггеры включаются в неявную транзакцию, требуемую для операторов вставки, обновления и удаления. Поскольку вы подключаетесь к связанному серверу в транзакции, SQL Server продвигает его в распределенную транзакцию.

Вам нужно настроить MSDTC, вы можете открыть MMC и загрузить плагин MSDTC или использовать следующий script для открытия входящих и исходящих транзакций.

https://technet.microsoft.com/en-us/library/cc731495.aspx

REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccess
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessTransactions
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessInbound
REG QUERY "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessOutbound
PAUSE

REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccess /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessTransactions /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessInbound /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /v NetworkDtcAccessOutbound /t REG_DWORD /d 1
PAUSE

net stop MSDTC
net start MSDTC
PAUSE

Ответ 2

В моем случае служба была остановлена ​​. Решение: необходимо включить службу MSDTC на

  • перейдите в Услуги. (СТАРТ > НАСТРОЙКИ > ПАНЕЛЬ УПРАВЛЕНИЯ > АДМИНИСТРАТИВНЫЕ ИНСТРУМЕНТЫ > УСЛУГИ)
  • Найдите службу с именем Координатор распределенных транзакций и RIGHT CLICK (на нем и выберите) > Начать.
  • чтобы эта служба запускала автоматически для решения этой проблемы на постоянной основе

Ответ 3

"Служба координатора распределенных транзакций" не была запущена, поэтому начал работу и изменил тип сервиса на автоматический.

Ответ 4

Я столкнулся с той же ошибкой, однако это не было так просто, как служба координатора распределенных транзакций не работать. Я получил обновление драйвера автоматически через окна, которые вызывали проблемы с COM+ и не позволяли MSDTC правильно обмениваться данными, даже если служба MSDTC работала. В моем случае это была проблема с драйверами горячих клавиш HP, но при исследовании я обнаружил и другие сообщения о проблемах с драйверами аудио от других производителей, которые также вызывали это.

Чтобы проверить, есть ли у вас похожая проблема, запустите Службы компонентов (dcomcnfg.exe), затем разверните Службы компонентов> Компьютеры> Мой компьютер. Нажмите здесь [Приложения CN10], чтобы увидеть, появится ли ошибка с "COM+ не может связаться с координатором распределенных транзакций Microsoft", или в навигационной панели значок "Мой компьютер" отображается с красной ошибкой.

Для меня было исправлено отключение служб "Горячая клавиша HP" и "HotKeyServiceUWP". Как только они были отключены, MSDTC сразу начал работать.