sql-server - habilitar - msdtc no está disponible en el servidor
El servidor MSDTC en el servidor no está disponible (3)
Me sale este extraño error en SQL Server. Y no puedo encontrar la solución en publicaciones antiguas.
Tengo este procedimiento:
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
Cuando ejecuto el procedimiento en el estudio de administración de esta manera:
exec dbo._upJM_SyncAll_test
todo está bien. No obtengo ningún error, la sincronización funciona bien.
Pero cuando puse ejecutar en trigger de esta manera:
create trigger _utrJM_SetSubj on tHE_SetSubj after insert, update, delete
as
begin
exec dbo._upJM_SyncAll_test
end
Me sale este error:
Msg 8501, nivel 16, estado 3, procedimiento _upJM_SyncAll_test, línea 54
MSDTC en el servidor ''servidor'' no está disponible.
El procedimiento _upJM_SyncAll_test tiene solo 39 líneas ...
El servicio "Coordinador de transacciones distribuidas" no se estaba ejecutando. Por lo tanto, el servicio comenzó y el tipo de servicio cambió también a automático.
En mi caso, el servicio fue detenido . solución: necesita activar el servicio MSDTC
- ve a Servicios . (INICIO> CONFIGURACIONES> PANEL DE CONTROL> HERRAMIENTAS ADMINISTRATIVAS> SERVICIOS)
- Encuentre el servicio llamado '' Coordinador de transacciones distribuidas '' y haga clic con el botón derecho (en él y seleccione)> Iniciar .
- hacer que este servicio se ejecute automáticamente para resolver este problema permanentemente
Los desencadenantes se incluyen en la transacción implícita requerida para las instrucciones de inserción, actualización y eliminación. Debido a que se está conectando a un servidor vinculado dentro de una transacción, SQL Server lo promueve a una transacción distribuida.
Tendrá que configurar MSDTC, puede abrir MMC y cargar el complemento MSDTC o usar la siguiente secuencia de comandos para abrir las transacciones entrantes y salientes.
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