2013年11月6日 星期三

[SQL SERVER] 當使用DBLINK時出現"因為連結伺服器的OLE DB提供者,無法開始分散式交易"錯誤訊息

當前端程式執行時出現如下的錯誤訊息
因為連結伺服器 "MYASSET" 的 OLE DB 提供者 "MSDASQL" 無法開始分散式交易。
連結伺服器 "MYASSET" 的 OLE DB 提供者 傳回訊息"[Microsoft][ODBC SQL Server Driver]分散式異動錯誤"。


系統環境:
主機A:Windows Server 2003 with SP2 x32 及 SQL Server 2000
主機B:Windows Server 2008 R2 x64 及 SQL Server 2008 R2 x64
主機B上的資料庫中的TABLE異動時會觸發觸發程序將主機B上的資料庫中的TABLE異動

解決步驟:
(一)在主機A
1. 依序展開[開始]->[系統管理工具]->[元件服務]

2. 在[元件服務]視窗中依序展開[元件服務]->[電腦]->在[我的電腦]上右鍵[內容]

3. 在[我的電腦 內容]視窗中的[MSDTC]頁籤按下[安全性設定]

4. 在[安全性設定]視窗中請依據如下圖方式設定,設定完後按下[確定]

5. 將主機重開機

(二)在主機B
1. 依序展開[開始]->[所有程式]->[系統管理工具]->[元件服務]

2. 在[元件服務]視窗中依序展開[元件服務]->[電腦]->在[我的電腦]->[Distributed Transaction Coordinator]->[本機 DTC]上右鍵[內容]

3. 在[本機 DTC - 內容]視窗中請依據如下圖方式設定,設定完後按下[確定]

4. 在[MSDTC 服務]視窗中按下[是]

5. 在[MSDTC 服務]視窗中按下[確定]後無須重開機

註:若主機上若有防火牆需開"分散式交易協調器"的通訊Port

參考資料:http://technet.microsoft.com/zh-tw/library/cc771891.aspx

[SQL SERVER] 在SQL Server 2008 R2 64 位元主機上 Create DBLink 到 SQL Server 2000 出現的錯誤訊息(二)

        在上一篇中嘗試過各種改法還是會有問題, 但是仔細看看每次出現的錯誤訊息都會出現一個關鍵字“OLE DB 提供者 "SQLNCLI10”,所以在想是不是還有其他的“提供者“可以用呢?

        在TECHNET中有提到許多種OLE DB的提供者做法既然SQLNCLI10不行,那就來試試ODBC,GOOD~果然換成ODBC可以了,不過效能比之前在SQL Server 2008 R2 x32對SQL Server 2000效能要差一些,不過至少是OK的。

        完成以下的設定程序後上一篇的錯誤訊息都不會產生,而且程式在執行時也不會有任何錯誤訊息了。

設定程序~
1. 若在SQL Server 2000 SP4主機上若沒執行過instcat.sql,請先執行在C:\Program Files\Microsoft SQL Server\MSSQL\Install\的路徑下的instcat.sql

2. 點選在[開始]->[系統管理工具]->[資料來源(ODBC)]
    註:一定要是64位元的ODBC,不然會有錯誤訊息

3. 在[ODBC 資料來源管理員]視窗的[系統資料來源名稱]按下[新增]

4. 在[建立新資料來源]視窗中選[SQL Server]後按下[完成]

5. 在[建立新的資料來源至SQL Server]視窗中的[名稱]及[伺服器]欄位輸入相關資訊後按[下一步]

6. 在[建立新的資料來源至SQL Server]視窗選取[由使用者所輸入的登入識別碼及密碼進行SQL SERVER帳戶驗證],將[連線到SQL Server以獲得其他設定選項的預設設定]打勾,並輸入對應的帳號密碼後按[下一步]

7. 在[建立新的資料來源至SQL Server]視窗中勾選[變更預設資料庫]並選取資料庫後按[下一步]

8. 在[建立新的資料來源至SQL Server]視窗中按[完成]

9. 在[ODBC Microsoft SQl Server 設定]視窗中按下[確定]

10. 在[ODBC 資料來源管理員] 視窗中按下[確定]

11. 開啟[SQL Server Management Studio]管理工具

12. 在[物件總管]視窗中依序展開[伺服器物件]->在[連結的伺服器]上右鍵選[新增連結的伺服器]

13. 在[新增連結的伺服器]視窗中依序輸入以下欄位
       a. 連結的伺服器:MYASSET  (註:這名稱可自取)
       b. 伺服器類型:選[其他資料來源]
            b1. 提供者:Microsoft OLE DB Provider for ODBC Drivers
            b2. 產品名稱:ASSET  (註:這名稱可自取)
            b3. 資料來源:ASSET

14. 在[新增連結的伺服器]視窗中的[安全性頁籤],點選[使用此安全性內容建立],並輸入[遠端登入]及[指定密碼]後按下[確定]



2013年11月5日 星期二

[SQL SERVER] 在SQL Server 2008 R2 64 位元主機上 Create DBLink 到 SQL Server 2000 出現的錯誤訊息(一)

需求:在SQL Server 2008 R2 64 位元主機(在此稱SQLServer01)的MYDB下的MYTABLE有個觸發程序,當MYTABLE異動時觸發程序會將異動透過DBLINK到SQL Server 2000(在此稱SQLServer02)上的TABLE

依據此篇做法在SQLServer01建立DBLINK後,當Create Trigger時會出現如下的錯誤訊息
訊息 7399,層級 16,狀態 1,程序 CBUpt,行 93
連結伺服器 "MYASSET" 的 OLE DB 提供者 "SQLNCLI10" 報告了錯誤。提供者並未給予任何關於錯誤的資訊。
訊息 7312,層級 16,狀態 1,程序 CBUpt,行 93
不能使用連結伺服器 "MYASSET" 的 OLE DB 提供者 "SQLNCLI10" 的結構描述或目錄。提供了四部分的名稱,但提供者並未公開必要的介面,以使用目錄或結構描述。

看了一下錯誤訊息,應該是DBLINK的提供者有某些設定造成,所以到SSMS->伺服器物件->連結的伺服器->提供者->SQLNCLI10上右鍵“屬性”,在“提供者選項 - SQL Server Native Client 10.0”視窗中將“提供者選項”中的“限層級零”的勾勾取消後按下“確定”


再Create Trigger結果又出現如下的錯誤,不過好在錯誤訊息換了
連結伺服器 "MYASSET" 的 OLE DB 提供者 "SQLNCLI10" 傳回訊息 "無法指出的錯誤"。
連結伺服器 "MYASSET" 的 OLE DB 提供者 "SQLNCLI10" 傳回訊息 "無法在伺服器中找到完成此操作所須的預存程序。請連絡您的系統管理員。"。
訊息 7311,層級 16,狀態 2,程序 CBUpt,行 93
無法為連結伺服器 "MYASSET" 的 OLE DB 提供者 "SQLNCLI10" 取得結構描述資料列集 "DBSCHEMA_TABLES_INFO"。提供者支援介面,但在使用時傳回失敗碼。

這段錯誤訊息看不出來問題在哪,所以透過GOOGLE找到微軟的一篇KB906954,簡單來說就是因為SQL Server 2000安裝SP4後系統預存程序沒有升級所以必須手動升級系統預存程序,在SQLServer02主機的C:\Program Files\Microsoft SQL Server\MSSQL\Install\的路徑下可以找到instcat.sql,可以透過osql或是管理工具去執行就完成了

好吧,再來一次Create Trigger,哇勒~又有錯誤訊息了,錯誤訊息如下
連結伺服器 "MYASSET" 的 OLE DB 提供者 "SQLNCLI10" 傳回訊息 "Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done."。
訊息 7306,層級 16,狀態 2,行 1
無法從連結伺服器 "MYASSET" 的 OLE DB 提供者 "SQLNCLI10" 開啟資料表 ""MY_DB"."dbo"."MY_YABLE""。提供者不支援在這個資料來源上的索引掃描。

咦~之前在DBLINK的提供者的屬性視窗中好像有出現“索引”的關鍵字,所以又再次進入“提供者選項 - SQL Server Native Client 10.0”視窗中將“提供者選項”中,這次為了確保不要再被提供者的屬性搞破壞,索性就把所有勾勾都取消只留下

好吧,再來一次Create Trigger,耶~終於Create成功了

雖然Trigger建成功了,但程式一執行將資料寫入MYDB下的MYTABLE時前端程式還是會出現供者不支援在這個資料來源上的索引掃描“,所以還是有問題,當然~我不會這麼容易放棄,在下一篇中會有最終解法~待續~