2015-04-02 8 views
32

मैं एसक्यूएल सर्वर पर इस अजीब त्रुटि मिलती है। और मुझे पुरानी पोस्ट में समाधान नहीं मिल रहा है।MSDTC सर्वर पर 'सर्वर अनुपलब्ध

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 

सब कुछ ठीक है

मैं इस प्रक्रिया है। मुझे कोई त्रुटि नहीं है, सिंक ठीक काम कर रहा है।

लेकिन जब मैं इस तरह ट्रिगर में निष्पादित कर दिया: ...

Msg 8501, Level 16, State 3, Procedure _upJM_SyncAll_test, Line 54
MSDTC on server 'server' is unavailable.

प्रक्रिया _upJM_SyncAll_test केवल 39 लाइनों है

+0

आप पहले स्थान पर डायनामिक एसक्यूएल का उपयोग क्यों कर रहे हैं ?, यह आवश्यक नहीं लगता है – Lamak

+0

अच्छी तरह से यह ऐसा है .. लिंक किया गया सर्वर [LOCAL_MYSQL] ऊपर और चल रहा है, लेकिन यह खुशी हो सकती है कि यह पहुंच योग्य नहीं है। उस स्थिति में यदि sp_executesql त्रुटि देता है तो मैं कुछ और करता हूं .. कृपया ध्यान दें कि _upJM_SyncAll_test सिर्फ इस पोस्ट के लिए परीक्षण प्रक्रिया है, _upJM_SyncAll अधिक जटिल है। – Kiki

उत्तर

17

ट्रिगर में शामिल हैं:

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

मैं इस त्रुटि मिलती है अंतर्निहित लेनदेन डालने, अद्यतन के लिए आवश्यक है, और बयानों को हटा दें। क्योंकि आप किसी लेन-देन के भीतर किसी लिंक किए गए सर्वर से कनेक्ट कर रहे हैं, एसक्यूएल सर्वर वितरित लेन-देन करने के लिए इसे बढ़ावा देता है।

आप MSDTC कॉन्फ़िगर करने की आवश्यकता होगी, तो आप या तो खुले एमएमसी 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

पहले विराम के बाद, आप सभी आदेशों के लिए/f विकल्प जोड़ सकते हैं: "बिना किसी प्रॉम्प्ट के मौजूदा रजिस्ट्री प्रविष्टि को ओवरराइट करना।" अन्यथा यह काम नहीं करेगा। इसके अलावा, यह पूरी तरह से काम करता है, धन्यवाद! – codea

+0

TechNet लिंक के लिए धन्यवाद। मैंने इसमें निर्देशों का पालन किया और मेरी समस्या हल की। – Rich

88

मेरे मामले में, सेवा रोक दिया गया। समाधान:

  1. पर MSDTC सेवा चालू करने के लिए की जरूरत सेवाएं में जाते हैं। (प्रारंभ> सेटिंग्स> नियंत्रण कक्ष> प्रशासनिक उपकरण> सर्विसेज)
  2. (इस पर और चुनें) सेवा 'वितरित विनिमय कोऑर्डिनेटर' और राइट क्लिक कहा जाता है का पता लगाएं>प्रारंभ
  3. इस सेवा भी स्वत: इस समस्या को स्थायी रूप से
+7

इसके अलावा, सेवा स्वचालित रूप से प्रारंभ करने के लिए उपयोगी हो सकती है। > गुण - - सही सेवा क्लिक करें> स्टार्टअप प्रकार और 'स्वचालित' का चयन करें।अन्यथा, आपको हर बार अपनी मशीन रीबूट करने की आवश्यकता होगी (या यदि सेवा किसी भी कारण से रुकती है) – Rob

+0

धन्यवाद। मेरे लिए भी काम किया। –

0

'वितरित विनिमय कोऑर्डिनेटर' सेवा नहीं चल रहा था, तो शुरू कर दिया सेवाओं और बदली हुई सेवा प्रकार हल करने के लिए स्वचालित रूप सेचलाने के लिए करते हैं।

संबंधित मुद्दे