Kik*_*iki 46 sql-server msdtc linked-server
我在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
Run Code Online (Sandbox Code Playgroud)
当我在管理工作室运行程序时,如下所示:
exec dbo._upJM_SyncAll_test
Run Code Online (Sandbox Code Playgroud)
一切都好.我没有错误,同步工作正常.
但当我把执行像这样的触发器:
create trigger _utrJM_SetSubj on tHE_SetSubj after insert, update, delete
as
begin
exec dbo._upJM_SyncAll_test
end
Run Code Online (Sandbox Code Playgroud)
我收到此错误:
消息8501,级别16,状态3,过程_upJM_SyncAll_test,第54行
服务器'服务器'上的MSDTC不可用.
程序_upJM_SyncAll_test只有39行......
Eve*_*ael 125
在我的情况下,服务已停止.解决方案:需要打开MSDTC服务
jti*_*ley 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" /f /v NetworkDtcAccess /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccessTransactions /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccessInbound /t REG_DWORD /d 1
REG ADD "HKLM\Software\Microsoft\MSDTC\Security" /f /v NetworkDtcAccessOutbound /t REG_DWORD /d 1
PAUSE
net stop MSDTC
net start MSDTC
PAUSE
Run Code Online (Sandbox Code Playgroud)
小智 9
我遇到了同样的错误,但它并不像分布式事务处理协调器服务那样简单.我通过Windows自动收到驱动程序更新,导致COM +出现问题,即使MSDTC服务正在运行,也不允许MSDTC正常通信.在我的情况下,这是惠普热键驱动程序的一个问题,但在研究中我发现其他制造商的音频驱动程序问题的其他报告也导致了这一问题.
要检查是否存在类似问题,请启动组件服务(dcomcnfg.exe),然后展开组件服务>计算机>我的电脑,从此处单击"COM +应用程序"以查看是否将弹出"COM +"错误无法与Microsoft分布式事务处理协调器通信"或者导航中的"我的电脑"图标将出现红色错误.
我的解决方法是禁用"HP Hotkey Service"和"HotKeyServiceUWP"服务.一旦禁用,MSDTC立即开始工作.