2011-06-06 91 views
1

我想同步2個數據庫特定的記錄。 假設我有兩個數據庫;如何同步2個數據庫

1.Shop 
2.Stock 

現在讓我們假設用戶更改庫存中特定產品的價格。我也想在店裏改變這個產品價格!

我鍛鍊的是 - 假設Internet連接是穩定的,

  • 當正股價格變動我調用Web服務這項服務將在插入Web數據表中的價格條目。
  • 現在,在商店方面,如果我發現任何新條目,我會在每20分鐘使用Web服務ping Web數據表,我會在店內更新相關產品價格!

我想過的另一個選擇是複製。但是我們使用的是SQL Server的快遞版本,根據我的知識快遞版本不能用作發佈者!

我的第一個選擇是爲此目的高效還是缺少一些東西,還有一個更好的選擇來實現此目的!

+0

複製或服務代理是這項工作的明顯工具,但正如您已經確定的那樣,他們至少需要一個非快速版SQL Server才能工作。 – 2011-06-06 10:40:21

+0

這個*可能是dba.SE的一個,但如果OP的SQL版本不能複製,那麼可能需要非數據庫編碼的解決方案。所以我暫時離開這裏。 – Kev 2011-06-06 23:51:05

回答

0

您可以在庫存表上創建一個觸發器。

CREATE TRIGGER triggerName 
ON [Stock].[dbo].[products] 
AFTER UPDATE 
AS 
IF (UPDATE (productPrice)) 
BEGIN 
    --insert to shop 
END 
GO 
+0

只是出於好奇 - 如果兩個數據庫位於不同的服務器和/或防火牆後面,這也可以工作嗎? – 2011-06-06 07:57:04

+0

即時通訊不知道有關防火牆,但對於不同的服務器(服務器必須連接在一起),你可以顯式引用表爲servername.databasename.tablename ..但這可能有一些性能問題......而不是你可以使用複製... – pRimE 2011-06-06 08:31:35

+1

我通常會建議不要交叉*數據庫*觸發器,更不用說交叉*服務器* - 如果網絡連接斷開,您有效地使該表成爲只讀,並且它產生的錯誤將會很有趣。 – 2011-06-06 10:37:26

1

你可以對錶的觸發器像總理說,上述但不是直接寫入到其他數據庫的更改寫入到本地「臨時」表,然後每隔20分鐘左右的計劃任務送第二個數據庫的更新。

您可以將第二個數據庫設置爲鏈接服務器。

這樣您可以避免使表中的觸發器處於只讀狀態,這是因爲兩個dbs之間的連接斷開。

+0

登臺表+1。 – 2011-10-26 14:18:47

0

如果無法使用MS SQL Server的複製功能(需要你已經確定一些非Express版本),針對這種情況(見http://msdn.microsoft.com/en-us/library/ms151198.aspx),那麼另一種選擇是使用MS同步框架(可以工作DB到SQL CE等,文件甚至自定義數據源等) - 請參閱http://msdn.microsoft.com/en-us/library/bb726002.aspx

如果真要實現這個代碼自己(我強烈反對的是),然後實現它作爲一個「推情景」:

  • DB觸發填補臨時表
  • 的Windows服務,並檢查在臨時表的變化和應用themn
  • 衝突解決規則的這一切
  • 完整的日誌記錄,以能夠分析差異(以防萬一)