新聞中心
SQL Server 2008數(shù)據(jù)庫中CDC的功能使用及說明的相關(guān)知識(shí)是本文我們主要要介紹的內(nèi)容,那么什么是CDC呢?CDC(Change Data Capture:變更數(shù)據(jù)捕獲)這個(gè)功能是SQL Server 2008企業(yè)版的功能,它提供了一種新的機(jī)制,對表格數(shù)據(jù)的更新進(jìn)行跟蹤,在數(shù)據(jù)倉庫的建設(shè)過程中,通過這種技術(shù),可以簡化從業(yè)務(wù)數(shù)據(jù)庫導(dǎo)入數(shù)據(jù)的復(fù)雜度。

劍河網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)!從網(wǎng)頁設(shè)計(jì)、網(wǎng)站建設(shè)、微信開發(fā)、APP開發(fā)、響應(yīng)式網(wǎng)站設(shè)計(jì)等網(wǎng)站項(xiàng)目制作,到程序開發(fā),運(yùn)營維護(hù)。創(chuàng)新互聯(lián)公司2013年成立到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來保證我們的工作的順利進(jìn)行。專注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)。
1. 準(zhǔn)備一個(gè)數(shù)據(jù)庫,里面準(zhǔn)備一個(gè)表,Orders
2. 啟用數(shù)據(jù)庫級別的CDC選項(xiàng)
--在數(shù)據(jù)庫級別啟用CDC功能
EXEC sys.sp_cdc_enable_db
這個(gè)命令執(zhí)行完之后,會(huì)在系統(tǒng)表里面添加6個(gè)表格
3.在需要做數(shù)據(jù)捕獲的表上面啟用CDC選項(xiàng)
- EXEC sys.sp_cdc_enable_table @source_schema='dbo',@source_name='Orders',@capture_instance='Orders',@supports_net_changes=0,@role_name=null
- http://msdn.microsoft.com/en-us/library/bb522475.aspx
執(zhí)行之后,會(huì)有如下的輸出消息
這個(gè)提示的意思是說,要啟動(dòng)SQL Server Agent。因?yàn)镃DC功能是要通過一個(gè)兩個(gè)作業(yè)來自動(dòng)化完成的
與此同時(shí),執(zhí)行上面的命令還將在系統(tǒng)表中添加一個(gè)表格
還會(huì)添加一個(gè)函數(shù)
4.插入或者更新數(shù)據(jù)測試CDC功能
--插入或者更新數(shù)據(jù)測試CDC功能
- INSERT Orders(CustomerID) VALUES('Microsoft');
- INSERT Orders(CustomerID) VALUES('Google');
- UPDATE Orders SET CustomerID='Yahoo' WHERE OrderID=1
- DELETE FROM Orders WHERE OrderID=2
這個(gè)范例插入兩行數(shù)據(jù),緊接著又對第一行更新,然后還刪除了第二行,所以最終只有一行數(shù)據(jù)
那么,我們來看看CDC做了什么事情呢?
SELECT * FROM cdc.Orders_CT
我們可以來解釋一下上面結(jié)果的含義:
__$operation=2的情況,表示新增
__$operation=3或者4,表示更新,3表示舊值,4表示新值
__$operation=1的情況,表示刪除
很好理解,不是嗎?
但是,我們一般都是需要按照時(shí)間范圍進(jìn)行檢索,對吧,所以,需要使用下面的語法進(jìn)行查詢
--按照時(shí)間范圍查詢CDC結(jié)果
- DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)
- DECLARE @start_time DATETIME = '2011-8-10 00:00:00'
- DECLARE @end_time DATETIME ='2011-8-11 00:00:00'
- SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)
- SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)
- SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all')
關(guān)于sys.fn_cdc_map_time_to_lsn這個(gè)函數(shù),請參考http://msdn.microsoft.com/en-us/library/bb500137.aspx
查詢的結(jié)果如下:
如果需要包含更新操作的舊值,則可以以下的語法
- DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)
- DECLARE @start_time DATETIME = '2011-8-10 00:00:00'
- DECLARE @end_time DATETIME ='2011-8-11 00:00:00'
- SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)
- SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)
- SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all update old')
通常,為了方便起見,我們會(huì)將這個(gè)查詢定義為一個(gè)存儲(chǔ)過程,如下
--定義存儲(chǔ)過程來進(jìn)行查詢
- CREATE PROC GetOrdersCDCResult(@start_time DATETIME,@end_time DATETIME)
- AS
- BEGIN
- DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)
- SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)
- SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)
- SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all')
- END
然后,每次需要用的時(shí)候,就直接調(diào)用即可。
--執(zhí)行存儲(chǔ)過程
EXEC GetOrdersCDCResult '2011-8-10','2011-8-11'
5.結(jié)合SSIS實(shí)現(xiàn)事實(shí)表的增量更新
下面展示了一個(gè)SSIS 包的設(shè)計(jì),這里面讀取CDC的數(shù)據(jù),先進(jìn)行一些查找,然后按照__$operation的值拆分成為三個(gè)操作,分別進(jìn)行插入,更新和刪除,這樣就可以實(shí)現(xiàn)對事實(shí)表的增量更新
本文所有的代碼如下:
- USE SampleDatabase
- GO
- --在數(shù)據(jù)庫級別啟用CDC功能
- EXEC sys.sp_cdc_enable_db
- --在需要做數(shù)據(jù)捕獲的表格上面啟用CDC功能
- EXEC sys.sp_cdc_enable_table @source_schema='dbo',@source_name='Orders',@capture_instance='Orders',@supports_net_changes=0,@role_name=null
- --插入或者更新數(shù)據(jù)測試CDC功能
- INSERT Orders(CustomerID) VALUES('Microsoft');
- INSERT Orders(CustomerID) VALUES('Google');
- UPDATE Orders SET CustomerID='Yahoo' WHERE OrderID=1
- DELETE FROM Orders WHERE OrderID=2
- --查詢CDC的結(jié)果
- SELECT * FROM cdc.Orders_CT
- --按照時(shí)間范圍查詢CDC結(jié)果
- DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)
- DECLARE @start_time DATETIME = '2011-8-10 00:00:00'
- DECLARE @end_time DATETIME ='2011-8-11 00:00:00'
- SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)
- SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)
- SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all')
- --定義存儲(chǔ)過程來進(jìn)行查詢
- CREATE PROC GetOrdersCDCResult(@start_time DATETIME,@end_time DATETIME)
- AS
- BEGIN
- DECLARE @from_lsn BINARY(10),@end_lsn BINARY(10)
- SELECT @from_lsn=sys.fn_cdc_map_time_to_lsn('smallest greater than or equal',@start_time)
- SELECT @end_lsn=sys.fn_cdc_map_time_to_lsn(' largest less than or equal',@end_time)
- SELECT * FROM cdc.fn_cdc_get_all_changes_Orders(@from_lsn,@end_lsn,'all')
- END
- --執(zhí)行存儲(chǔ)過程
- EXEC GetOrdersCDCResult '2011-8-10','2011-8-11'
以上就是SQL Server 2008數(shù)據(jù)庫中CDC的功能使用及說明的全部內(nèi)容,本文我們就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!
網(wǎng)頁名稱:SQLServer2008數(shù)據(jù)庫中CDC的功能使用及說明
本文網(wǎng)址:http://m.fisionsoft.com.cn/article/coehigs.html


咨詢
建站咨詢
