2009-06-14 86 views
1

我正在編寫一個事件日曆,並且我需要從另一個數據庫中提取日曆的數據,並在提交之前進行一些更改。在兩個SQL數據庫之間集成數據的最佳方法?

你會提出什麼樣的基本方法?

此數據不是超級敏感或需要企業解決方案。

我正在考慮編寫一個在我的服務器上運行的服務,它會每隔一小時檢查一次外部數據庫的變化,如果有的話 - 將它們加載到我的數據庫表中。有一個更簡單的方法嗎?

謝謝

回答

3

有一堆選項。 2級很容易的解決方案來實現的:

  1. 你可以使用SSIS(SQL Server集成服務)將數據傳送到和傳送數據源
  2. 您還可以使用SQL Server複製,併成立了發佈/訂閱方案。
1

您可以編寫一個存儲過程來檢查外部數據庫中的新數據,然後進行必要的更改,然後將其結束。

然後,您可以設置一個SQL Server代理作業,執行該存儲過程並將其設置爲每小時運行一次。

1

我同意科迪,他的答案都有1和2有用。儘管可能對您的目的有點複雜

使用存儲過程 - 推薦的方法 - 可能必須先連接服務器。

看來,這也許可以供你使用,無論是運行代碼,手動SP或設置在SQL Server代理計劃的作業

http://msdn.microsoft.com/en-us/library/aa213778(SQL.80).aspx

1

鏈接服務器添加到其他服務器,你可以從中查詢,如:

select * from [LinkedServer].dbname.dbo.Table 

這樣,你總是使用最新信息,而且也沒有必要寫一個腳本或存儲過程決定「什麼是新的」或「其行已改變」。

1

您的選擇取決於您運行的SQL Server的風格。但您的整合的確切要求更重要。單向集成最簡單和效率最低的方法是在從源中加載新日曆事件之​​前從目標中刪除每個日曆事件。如果沒有很多要同步的事件,這可能就足夠了,就像你根本不需要加載過去的事件一樣。但是,如果您需要跟蹤同步狀態,情況會變得更加複雜,並且工具開始變得重要。有在這種融合的兩個階段:

  1. 提取源更改的數據和
  2. 轉換和加載數據到目標

提取改變

的每個版本SQL2008有一個新的change tracking功能,特別針對同步場景。更改跟蹤與僅受SQL 2008 Enterprise Edition支持的更改數據捕獲不同。如果源數據庫正在運行SQL 2008,那麼我肯定會首先查看更改跟蹤。主要好處是您不需要設置元數據來處理更改數據檢測,例如存儲上次加載的時間戳並將其與事件修改時間戳進行比較等。您不需要對用戶進行任何DDL更改表來跟蹤變化,除了在打開更改跟蹤:

ALTER DATABASE AdventureWorks2000 SET CHANGE_TRACKING = ON 
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON); 
GO 
USE AdventureWorks2000; 
GO 
ALTER TABLE Person.Person ENABLE CHANGE_TRACKING 
    WITH (TRACK_COLUMNS_UPDATED = ON); 
GO 

如果您不能使用更改跟蹤,我會建議使用時間戳或版本號,而不是填充一個單獨的變化表觸發器。觸發器可能在這裏將其切斷,但我仍然建議避免它們。:)您可能已經在數據庫模式中具有必要的時間戳了。

設置複製是進行更改數據捕獲的有趣方法。實際上,它在技術上是SQL2008企業版中CDC的前身。我自己並沒有使用CDC的複製,但是例如在this book中,作者使用它有很好的經驗。

轉換和加載

使用SQL代理調度SSIS包。如果您每次都可以完成全部加載而不是加載更改,那麼這就是您所需要的。

另一種選擇是安排存儲過程,但處理記錄錯誤等事情不會那麼簡單。我的經驗是,開發SSIS包比使用T-SQL快很多,特別是如果涉及到鏈接服務器的話。

SQL Server Express的問題

的SQL Server Express(2005/2008)does not have SQL Agent,只能充當replication subscriber。我通常最終編寫了用於SQL Express集成作業的Windows服務,但是使用外部調度程序來運行存儲過程可能工作得很好。編寫和調度存儲過程可能比開發服務要快得多。

SQL Server Express 2008確實有SSIS運行時,但我不完全知道它自not all features are supported以來是多麼有限。但是,導入/導出嚮導確實有效。

相關問題