服务器'服务器上的MSDTC不可用

时间:2015-04-02 13:31:04

标签: sql-server linked-server 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,Level 16,State 3,Procedure _upJM_SyncAll_test,Line 54
  服务器&#39;服务器上的MSDTC&#39;不可用。

程序_upJM_SyncAll_test只有39行...

5 个答案:

答案 0 :(得分:22)

触发器包含在insert,update和delete语句所需的隐式事务中。因为您要连接到事务中的链接服务器,所以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

答案 1 :(得分:8)

我遇到了同样的错误,但是它不像Distributed Transaction Coordinator服务无法运行那样简单。我通过Windows自动收到一个驱动程序更新,该更新导致COM +出现问题,即使MSDTC服务正在运行,也不允许MSDTC正确通信。就我而言,这是HP热键驱动程序的问题,但在研究中,我发现其他报告也表明其他制造商的音频驱动程序也有问题。

要检查是否存在类似问题,请启动组件服务(dcomcnfg.exe),然后展开“组件服务”>“计算机”>“我的电脑”,从此处单击“ COM +应用程序”以查看是否会弹出错误。与“ COM +无法与Microsoft分布式事务处理协调器通话”,否则导航栏中“我的电脑”图标上将出现红色错误。

对我来说,解决方法是禁用“ HP Hotkey Service”和“ HotKeyServiceUWP”服务。禁用这些服务后,MSDTC立即开始工作。

答案 2 :(得分:0)

&#39;分布式事务协调员&#39;服务没有运行,所以启动服务并将服务类型更改为自动。

答案 3 :(得分:0)

我的问题通过禁用有冲突的服务/驱动程序得到解决。我禁用了我所有的HP服务(HP App Helper,HP CASL,HP系统信息),现在可以正常使用。

答案 4 :(得分:0)

在我的情况下,我在远程服务器上有一个Microsoft SQL Server的命名实例,我的应用程序的错误输出如下所示:

System.Data.SqlClient.SqlException (0x80131904): MSDTC on server 'SERVER\INST_NAME' is unavailable.

使用SQL连接字符串进行实验,例如用SERVERTCP_PORT_NUMBER替换SERVER \ INST_NAME并没有帮助。我仍然遇到相同的错误,因此决定安装默认实例(MSSQLSERVER),以使SQL Server名称仅变为SERVER。 RPC和MSDTC开始解析名称后,此问题得以解决。