我正在編寫一個事件日曆,並且我需要從另一個數據庫中提取日曆的數據,並在提交之前進行一些更改。在兩個SQL數據庫之間集成數據的最佳方法?
你會提出什麼樣的基本方法?
此數據不是超級敏感或需要企業解決方案。
我正在考慮編寫一個在我的服務器上運行的服務,它會每隔一小時檢查一次外部數據庫的變化,如果有的話 - 將它們加載到我的數據庫表中。有一個更簡單的方法嗎?
謝謝
我正在編寫一個事件日曆,並且我需要從另一個數據庫中提取日曆的數據,並在提交之前進行一些更改。在兩個SQL數據庫之間集成數據的最佳方法?
你會提出什麼樣的基本方法?
此數據不是超級敏感或需要企業解決方案。
我正在考慮編寫一個在我的服務器上運行的服務,它會每隔一小時檢查一次外部數據庫的變化,如果有的話 - 將它們加載到我的數據庫表中。有一個更簡單的方法嗎?
謝謝
有一堆選項。 2級很容易的解決方案來實現的:
您可以編寫一個存儲過程來檢查外部數據庫中的新數據,然後進行必要的更改,然後將其結束。
然後,您可以設置一個SQL Server代理作業,執行該存儲過程並將其設置爲每小時運行一次。
我同意科迪,他的答案都有1和2有用。儘管可能對您的目的有點複雜
使用存儲過程 - 推薦的方法 - 可能必須先連接服務器。
看來,這也許可以供你使用,無論是運行代碼,手動SP或設置在SQL Server代理計劃的作業
http://msdn.microsoft.com/en-us/library/aa213778(SQL.80).aspx
鏈接服務器添加到其他服務器,你可以從中查詢,如:
select * from [LinkedServer].dbname.dbo.Table
這樣,你總是使用最新信息,而且也沒有必要寫一個腳本或存儲過程決定「什麼是新的」或「其行已改變」。
您的選擇取決於您運行的SQL Server的風格。但您的整合的確切要求更重要。單向集成最簡單和效率最低的方法是在從源中加載新日曆事件之前從目標中刪除每個日曆事件。如果沒有很多要同步的事件,這可能就足夠了,就像你根本不需要加載過去的事件一樣。但是,如果您需要跟蹤同步狀態,情況會變得更加複雜,並且工具開始變得重要。有在這種融合的兩個階段:
提取改變
的每個版本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以來是多麼有限。但是,導入/導出嚮導確實有效。