Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 服务器“服务器不可用”上的MSDTC_Sql Server_Linked Server_Msdtc - Fatal编程技术网

Sql server 服务器“服务器不可用”上的MSDTC

Sql server 服务器“服务器不可用”上的MSDTC,sql-server,linked-server,msdtc,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 i

我在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
一切都好。我没有收到任何错误,同步工作正常

但当我将execute放入触发器时,如下所示:

  exec dbo._upJM_SyncAll_test
create trigger _utrJM_SetSubj on tHE_SetSubj after insert, update, delete
as
begin
    exec dbo._upJM_SyncAll_test
end
System.Data.SqlClient.SqlException (0x80131904): MSDTC on server 'SERVER\INST_NAME' is unavailable.
我得到这个错误:

Msg 8501,16级,状态3,程序upJM\U SyncAll\U测试,第54行 服务器“服务器”上的MSDTC不可用


过程upJM_SyncAll_测试只有39行

触发器包含在insert、update和delete语句所需的隐式事务中。由于您要连接到事务中的链接服务器,SQL server将其升级为分布式事务

您需要配置MSDTC,您可以打开MMC并加载MSDTC插件,或者使用以下脚本打开入站和出站事务


就我而言,服务已经停止。解决方案:需要打开MSDTC服务

去服务中心。开始>设置>控制面板>管理工具>服务 查找名为“分布式事务协调器”的服务,然后 右键单击它并选择>开始。 使此服务自动运行以永久解决此问题
“Distributed Transaction Coordinator”服务未运行,因此启动了该服务并将服务类型也更改为automatic。

我遇到了相同的错误,但这并不像Distributed Transaction Coordinator服务不运行那样简单。我通过windows自动接收到驱动程序更新,导致COM+出现问题,并且即使MSDTC服务正在运行,也不允许MSDTC正常通信。在我的案例中,这是HP热键驱动程序的问题,但在研究中,我发现其他制造商的音频驱动程序问题的其他报告也导致了这一问题

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


我的解决方案是禁用“HP热键服务”和“热键服务UWP服务”。一旦这些被禁用,MSDTC立即开始工作

我的问题通过禁用冲突服务/驱动程序得到解决。我禁用了所有HP服务HP App Helper、HP CASL、HP System Info,现在一切正常。

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

  exec dbo._upJM_SyncAll_test
create trigger _utrJM_SetSubj on tHE_SetSubj after insert, update, delete
as
begin
    exec dbo._upJM_SyncAll_test
end
System.Data.SqlClient.SqlException (0x80131904): MSDTC on server 'SERVER\INST_NAME' is unavailable.

尝试使用SQL连接字符串,例如用服务器替换服务器\INST\u名称,TCP\u端口号没有帮助。我仍然收到相同的错误,我决定安装一个默认实例MSSQLSERVER,使SQL Server名称成为仅限服务器。当RPC和MSDTC开始解析名称时,这就解决了问题。

为什么您首先要使用动态SQL?似乎没有必要这么做。是这样的。。链接服务器[LOCAL_MYSQL]已启动并运行,但可能发生无法访问的情况。在这种情况下,如果sp_executesql返回错误,我将执行其他操作。。请注意,_upJM_SyncAll_test只是这篇文章的测试过程,_upJM_SyncAll更复杂。第一次暂停后,您可以在所有命令中添加/f选项:强制覆盖现有注册表项而不提示。否则这就行不通了。除此之外,这项工作非常完美,谢谢!感谢technet链接。我按照其中的说明解决了我的问题。一件事是启动MSDTC,但是打开入站和出站事务意味着什么,为什么需要它?另外,让服务自动启动可能很有用。右键单击服务->属性->启动类型并选择“自动”。否则,您将需要在每次机器重新启动或服务因任何原因停止时执行此操作。这是一个比公认的答案更好、更简单的解决方案,您的解决方案救了我一命。万分感谢!非常感谢!这让我发现联想可能是罪魁祸首。原来是LenovoSmartStandby服务需要作为临时解决方案禁用。哦,我的天哪!!我有完全相同问题的几率有多大,非常感谢!我在宏碁Swift 5上似乎也有这个问题。但不知道应该停止哪些服务。在我的例子中——联想ThinkPad P52——原因是杜比DAX API服务。