web-dev-qa-db-fra.com

MSDTC sur le serveur 'serveur est indisponible

Je reçois cette erreur étrange sur SQL Server. Et je ne trouve pas de solution dans les anciens messages. 

J'ai cette procédure:

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

Quand j'exécute la procédure dans le studio de gestion comme ceci:

  exec dbo._upJM_SyncAll_test

tout va bien. Je ne reçois aucune erreur, la synchronisation fonctionne parfaitement. 

Mais quand je mets exécuter en déclencheur comme ceci:

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

Je reçois cette erreur:

Msg 8501, niveau 16, état 3, procédure _upJM_SyncAll_test, ligne 54
MSDTC sur le serveur 'serveur' n'est pas disponible.

La procédure _upJM_SyncAll_test ne comporte que 39 lignes ... 

39
Kiki

Dans mon cas, le service était arrêté . solution: nécessité d'activer le service MSDTC

  1. allez à Services . (DEBUT> REGLAGES> PANNEAU DE COMMANDE> OUTILS D'ADMINISTRATION> SERVICES)
  2. Recherchez le service appelé ' Distributed Transaction Coordinator ' et CLIQUEZ À DROITE (dessus et sélectionnez)> Démarrer .
  3. faire en sorte que ce service s'exécute automatiquement pour résoudre ce problème de façon permanente
114
Everson Rafael

Les déclencheurs sont inclus dans la transaction implicite requise pour les instructions d'insertion, de mise à jour et de suppression. Comme vous vous connectez à un serveur lié dans une transaction, SQL Server le convertit en transaction distribuée.

Vous devez configurer MSDTC. Vous pouvez soit ouvrir MMC et charger le plug-in MSDTC, soit utiliser le script suivant pour ouvrir des transactions entrantes et sortantes.

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
22
jtimperley

J'ai rencontré la même erreur, mais ce n'était pas aussi simple que de ne pas exécuter le service Coordinateur de transactions distribuées. J'ai reçu automatiquement une mise à jour de pilote via Windows qui posait des problèmes avec COM + et empêchait MSDTC de communiquer correctement, même si le service MSDTC était en cours d'exécution. Dans mon cas, c’était un problème avec les pilotes de raccourcis clavier HP, mais lors de mes recherches, j’ai trouvé d’autres rapports faisant état de problèmes avec les pilotes audio d’autres fabricants. 

Pour vérifier si vous rencontrez un problème similaire, lancez Component Services (dcomcnfg.exe), puis développez Services de composants> Ordinateurs> Poste de travail. À partir de là, cliquez sur "Applications COM +" pour voir si une erreur s'affichera avec "COM + Impossible de parler au coordinateur des transactions distribuées Microsoft "ou une erreur rouge apparaît sur l'icône représentant le Poste de travail dans la navigation. 

Le correctif pour moi était de désactiver les services "HP Hotkey Service" et "HotKeyServiceUWP". Une fois ceux-ci désactivés, MSDTC a immédiatement commencé à fonctionner. 

6
Mac

Le service 'Distributed Transaction Coordinator' ne fonctionnait pas, le service a donc été démarré et le type de service a été remplacé par automatique.

0
Subhash Madhukar