2013-08-20 34 views
1

我有一個表在sql服務器和一個表中有相同的名稱和字段在MySQL服務器。我使用以下觸發連接它們trhough鏈接服務器:Sql不排隊查詢到鏈接的服務器

CREATE TRIGGER items_insert ON [prueba] 
FOR INSERT 
AS 
BEGIN 
declare @tmp table (a int, b varchar(10)) 
insert @tmp (a, b) select ID, Name from inserted 
COMMIT 
SET XACT_ABORT ON 
INSERT INTO OPENQUERY(WEBDB, 'SELECT * FROM prueba') 
SELECT a, b FROM @tmp 
begin tran 
end 

我的問題是,當我脫機的MySQL的serverm和我插入SQL Server中的記錄,它顯然不mysql中插入,但是當我把它沒有的MySQL服務器。我想要一個排序隊列,以便當服務器之間的連接斷開時,在連接恢復時,在此期間的任何新記錄都會插入到mysql中。我怎麼能做到這一點?我新的SQL Server和觸發

注:觸發根據this教程,因爲我是獲取有關事務的錯誤

+0

我會建議有一個及時運行的SQL Server作業,並拿起記錄,並推送到MySQL數據庫。您可能需要跟蹤SQL Server表中某些布爾列所推送的記錄。 – Nilesh

回答

2

觸發器將永遠不會排隊一個奇怪的錯誤有@tmp聲明並在觸發器內使用鏈接的服務器是a bad idea。你會發現有數百人用我這樣做過的一個人的手指燃燒他們的手指。

對於任何隊列類型的系統,您需要實現服務代理,或者Nilesh指出使用排隊表的作業。

您目前的設置將會非常成問題,因爲我在幾年前使用相同的方法試圖從SQL2005獲取數據到MySQL服務器。偶爾在SQL2000中,您實際上可以將數據從MSSQL複製到任何其他ODBC數據源。微軟在SQL2005中停止了這一點。

所以你有兩個選擇。

  1. 學習Service Broker:Service Broker是一個很棒但很少使用的SQL。它是一種異步排隊技術,允許您將消息發送到其他遠程系統檢查this鏈接以獲取更多信息。然而,這將需要花費時間和精力來實施,因爲你必須學習安靜一點,即陡峭的學習曲線。
  2. 按計劃創建隊列表和進程。用一個已處理的標誌創建一個包含要插入MySQL的數據的表。在觸發器中插入這些數據到表中。創建一個每分鐘運行一次的SQL服務器作業,並將排隊表中的數據插入到MySQL數據庫中。成功插入後,將其標記爲已處理。
  3. 將處理過的標誌添加到原始表中。創建一個使用該表格的作業來獲取所有尚未插入的項目並將其插入計劃中。這就像選項2,但你不創建一個額外的表。