web-dev-qa-db-ja.com

サーバー 'サーバー上の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

全て大丈夫。エラーは発生せず、同期は正常に機能しています。

しかし、次のように実行にトリガーを入れると:

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

私はこのエラーを受け取ります:

メッセージ8501、レベル16、状態3、プロシージャ_upJM_SyncAll_test、行54
サーバー 'server'のMSDTCは使用できません。

_upJM_SyncAll_testプロシージャには39行しかありません...

45
Kiki

私の場合、サービスは停止でした。解決策:MSDTCサービスをオンにする必要があります

  1. サービスに移動します。 ([スタート]> [設定]> [コントロールパネル]> [管理ツール]> [サービス])
  2. Distributed Transaction Coordinator」と呼ばれるサービスを見つけて、右クリック(その上で選択)> Start
  3. このサービスを実行するようにします自動この問題を永続的に解決するため
122
Everson Rafael

トリガーは、挿入、更新、および削除ステートメントに必要な暗黙的なトランザクションに含まれています。トランザクション内でリンクサーバーに接続しているため、SQL Serverはそれを分散トランザクションに昇格させます。

MSDTCを構成する必要があります。MMCを開いてMSDTCプラグインを読み込むか、次のスクリプトを使用してインバウンドおよびアウトバウンドトランザクションを開くことができます。

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

同じエラーが発生しましたが、Distributed Transaction Coordinatorサービスが実行されていないほど簡単ではありませんでした。 COM +で問題が発生し、MSDTCサービスが実行されていてもMSDTCが適切に通信できないようにしているドライバー更新をWindowsから自動的に受け取りました。私の場合、これはHPホットキードライバーの問題でしたが、調査の結果、他のメーカーのオーディオドライバーの問題に関する他のレポートも見つけました。

同様の問題があるかどうかを確認するには、コンポーネントサービス(dcomcnfg.exe)を起動し、[コンポーネントサービス]> [コンピューター]> [マイコンピューター]を展開し、[COM +アプリケーション]をクリックして、[COM + 「Microsoft分散トランザクションコーディネーターと通信できません」またはナビゲーションの[マイコンピューター]のアイコンに赤いエラーが表示されます。

私にとっての修正は、「HP Hotkey Service」および「HotKeyServiceUWP」サービスを無効にすることでした。これらが無効になると、MSDTCはすぐに動作を開始しました。

9
Mac

「分散トランザクションコーディネーター」サービスが実行されていなかったため、サービスを開始し、サービスタイプも自動に変更しました。

0