最近工作中需要跨服務器同步數據,在數據庫DB1中的表T1插入數據,同時觸發T1的觸發器(這里暫不討論觸發器的效率問題),向另一台服務器DB2中的相同的一張表T2插入數據,查看了一些資料說,
需要打開DTC(分布式交易協調器)協調跨多個數據庫、消息隊列、文件系統等資源管理器的事務,
於是按照網上說的,將自己的DTC打開啟動,步驟如下:
DTC位置:控制面板--管理工具--服務--Distributed Transaction Coordinator
然后在本機SqlServer里新建一個觸發器測試了一下,提示“該伙伴事務管理器已經禁止了它對遠程/網絡事務的支持”
出現這個問題的原因是對方電腦沒有配置好DTC,所以需要將另一台服務器也做如下配置:
兩台服務器電腦做如下配置(windows2003系統):
2. 單擊“添加/刪除 Windows 組件”。
3. 選擇“應用程序服務器”,然后單擊“詳細信息”。
4. 選擇“啟用網絡 DTC 訪問”,然后單擊“確定”。
5. 單擊“下一步”;單擊“完成”。
6. 在"開始"->"運行"中輸入dcomcnfg.exe啟動"組件服務"。
7. 右鍵“我的電腦”->“屬性”,在MSDTC選項卡中,點擊“安全配置”按鈕。
8. 在安全配置窗口中做如下設置:
(1)選中“網絡DTC訪問”
(2)在客戶端管理中選中“允許遠程客戶端”“允許遠程管理”
(3)在事務管理通訊中選“允許入站”“允許出站”“不要求進行驗證”
(4)保證DTC登陸賬戶為:NT Authority\NetworkService
(5)單擊"確定"。這樣將會提示您"MS DTC 將會停止並重新啟動。
所有的依賴服務將被停止。請按'是'繼續"。單擊"是"繼續。
我當時先拿同事的電腦做了下測試,同事的系統是Win7,按上面的步驟沒有找到“應用程序服務器”,需要按下面的方法操作:
Vista, Windows 7,Windows Server 2008 MSDTC配置
1. 打開“控制面板(Control Panel)―管理工具(Administrative Tools)―組件服務(Component
Service)”(或者開始-運行 “Dcomcnfg.exe”)
2. 打開“組件服務(Component Service)―計算機(Computers)”
3. 在“我的電腦(My Computer)”上點擊右鍵,點擊“屬性(Properties)”
4. 在Local DTC Properties對話框中,點擊“安全(Security)”選項卡。 在安全配置選項卡中做如下設置:
選中“網絡DTC訪問(Network DTC Access)” 在客戶端管理(Client and Administration)中選中“允許遠程客戶端(Allow remote Clients)”
和“允許遠程管理(Allow Remote Administration)”
在事務管理通訊(Transaction Manager Communication)中選“允許入站(Allow
Inbound)”“允許出站(Allow Outbound)”“不要求進行驗證(No Authentication Required)”
保證DTC登陸賬戶為:NT Authority\Network Service
再次測試出現提示:“其他會話正在使用事務的上下文”,這是因為對方服務器表中也有觸發器,需要進行一下判斷。
********************************當兩台服務器不在一個網段的時候,還有可能出現一個問題*******************************
如果兩台服務器在一個網段的時候,按上面的設置,基本就可以搞定了,但是當兩台服務器不在一個網段的時候,SQLServer還有可能報下面的錯誤:
鏈接服務的OLE DB 訪問接“SQLNCLI10”返回了消息“該事務管理已經禁止了它對遠程事務的支持”
然后我對要請求訪問的服務器A做了以下操作,修改A服務器的host文件,增加B的IP地址和服務器名,然后問題就解決了。
下面給出測試的例子:
--創建測試表 CREATE TABLE [dbo].[TB1]( [id] [int] NULL, [age] [money] NULL ) ON [PRIMARY] GO --創建鏈接服務器 exec sp_addlinkedserver 'it38 ', ' ', 'SQLOLEDB ', '172.16.3.38' --對方服務器地址 exec sp_addlinkedsrvlogin 'it38 ', 'false ',null, 'sa', 'sa' --對方服務器用戶名密碼 --刪除創建的鏈接服務器時使用 --exec sp_dropserver 'it38 ', 'droplogins ' --為表TB1創建觸發器 CREATE TRIGGER [dbo].[tr_qiao] on [dbo].[TB1] FOR INSERT AS BEGIN SET NOCOUNT ON SET XACT_ABORT ON INSERT INTO it38.[數據庫名].dbo.TB1(id,age) SELECT id, age FROM inserted; END GO --***********************************************
--查詢對方數據庫表數據
SELECT * FROM it38.[數據庫名].[dbo].[TB1]
--插入一條數據測試 INSERT INTO TB1(id,age) values(5,55);