如果在 Windows .NET Server 上安裝的 SQL Server 2000 中運行鏈接服務器查詢,可能會返回下列錯誤(即使 MSDTC 正在該服務器上運行):
Resource Manager Creation Failed:Result Code = 0x8004d01c
這是設計使然。如果在"本地系統"帳戶下運行"分布式事務處理協調器服務"就會發生此錯誤。
最近為了提高 RPC 安全性對 DTC 所做的更改要求 MSDTC 作為"NT Authority\NetworkService"運行。這是 .NET Server 的默認選項。在 Windows NT 和 Windows 2000 中,默認情況下 MSDTC 服務是在"本地系統"帳戶下運行的。 警告:"注冊表編輯器"使用不當可造成嚴重問題,這些問題可能需要重新安裝操作系統。Microsoft 不保證能夠解決因為"注冊表編輯器"使用不當而產生的問題。使用"注冊表編輯器"需要您自擔風險。 若要將 MSDTC 服務帳戶從"本地系統"更改為"NT Authority\NetworkService",請執行下列步驟: 1.運行 regedt32,浏覽至 HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC。 添加一個 DWORD 值 TurnOffRpcSecurity,值數據為 1。2.打開命令提示,運行"net stop msdtc",然後運行"net start msdtc"。3.轉至"組件服務管理工具"。 a. 浏覽至"啟動管理工具"。b. 選擇"組件服務"。c. 展開"組件服務"樹,然後展開"我的電腦"。d. 右鍵單擊"我的電腦",然後選擇"屬性"。e. 在 MSDTC 選項卡中,確保選中了下列選項:
網絡 DTC 訪問 網絡管理 網絡事務 XA 事務另外,"DTC 登錄帳戶"一定要設置為"NT Authority\NetworkService"。f. 單擊"確定"。這樣將會提示您"MS DTC 將會停止並重新啟動。所有的依賴服務將被停止。請按'是'繼續"。單擊"是"繼續。g. 單擊"確定"關閉"我的電腦"屬性窗口。4.再次運行 regedt32,浏覽至 HKEY_LOCAL_MACHINE\Software\Microsoft\MSDTC,然後刪除 TurnOffRpcSecurity 項。現在您的 MSDTC 服務應該在"NT Authority\NetworkService"帳戶下運行了,並且不會再出現該錯誤。
當"MSDTC 安全性"配置下的"網絡 DTC 訪問"禁用時,如果運行鏈接服務器查詢則會返回下列錯誤: Server:Msg 7391, Level 16, State 1, Line 2 The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.[OLE/DB provider returned message:New transaction cannot enlist in the specified transaction coordinator.]
跟蹤標記 7300 打開時:Server:Msg 7391, Level 16, State 1, Line 2 The operation could not be performed because the OLE DB provider 'SQLOLEDB' was unable to begin a distributed transaction.[OLE/DB provider returned message:New transaction cannot enlist in the specified transaction coordinator.] OLE DB error trace [OLE/DB Provider 'SQLOLEDB' ITransactionJoin::JoinTransaction returned 0x8004d00a].
MSDTC 服務一定要按照上面"解決方案"一節中的說明進行設置,才能防止此錯誤。 再現現象的步驟 1.轉至"啟動管理工具服務"。2.右鍵單擊"分布式事務處理協調器"服務,轉至"登錄"選項卡,選擇"登錄身份"下的"本地系統"帳戶。3.停止然後重新啟動該服務。4.從查詢分析器,運行下列腳本:exec sp_addlinkedserver remote1 exec sp_setnetname remote1, <remote server name> go exec remote1.pubs.dbo.sp_executesql N'create table t (c1 int)' go set xact_abort on go begin tran insert into remote1.pubs.dbo.t values (1) commit tran go