文章的第一部分說明了如何在數據庫中啟動SQL Server這項新功能--捕捉數據變化,同時也講解了如何對數據表啟用這項功能,並監控表上數據定義語言的變化,並解釋了CDC模式以及該模式下各對象實現的功能。
注:本文根據SQL Server 2008-11月CTP寫作而成。
這一部分將繼續討論在數據庫和表上啟動捕獲數據變化這一功能,對於開啟了CDC的表,SQL Server又是如何監控它們的數據變化的。
在文章的第一部分,我們創建了一個名為Mydatabase的數據庫,並在該數據庫中創建了一個名為Mytable的表,現在我們要在該表上增加一些列,來看看數據定義語言的變化是如何被捕捉的。
下面,我們先向數據庫中添加一些數據。
第一步
執行如下T-SQL語句,如下圖Fig 1.1所示。
useMyDataBase
go
select*fromMyTable
go
InsertintoMytablevalues(1,'DanceDoll','221,WestBroadst,
Greenbay,Wisconsin',60000,1000)
InsertintoMytablevalues(2,'RainbowColors','21,Eastst,
Denville,NewJersey',68000,1300)
InsertintoMytablevalues(3,'RiverDance','1,SouthBroadst,
Quincy,Massachusetts',76000,1600)
InsertintoMytablevalues(4,'MickeyMouse','5,Main,
Greenbay,Wisconsin',120000,12000)
InsertintoMytablevalues(5,'UniversalStudiOS','7,Newroad,
Danbury,Connecticut',45000,1600)
go
執行結果
ID,Name,Address,Salary,Bonus
homesql2008(HOMEMAK):(0row(s)affected)
homesql2008(HOMEMAK):(1row(s)affected)
homesql2008(HOMEMAK):(1row(s)affected)
homesql2008(HOMEMAK):(1row(s)affected)
homesql2008(HOMEMAK):(1row(s)affected)
homesql2008(HOMEMAK):(1row(s)affected)
圖Fig 1.1
CDC模式下,表lsn_time_mapping記錄了lsn名稱,事務開始和結束時間。我們可以查詢一下這個表,查詢語句如下:參考圖Fig 1.2
select*fromcdc.lsn_time_mapping
執行結果
start_lsn,tran_begin_time,tran_end_time,tran_id
0x0000001C0000018B002F,2008-01-1601:53:38.840,2008-01-1601:53:38.840,0x00000000029C
0x0000001C000001920003,2008-01-1601:53:38.857,2008-01-1601:53:38.857,0x00000000029F
0x0000001C000001930003,2008-01-1601:53:38.857,2008-01-1601:53:38.857,0x0000000002A0
0x0000001C000001940003,2008-01-1601:53:38.857,2008-01-1601:53:38.857,0x0000000002A1
0x0000001C000001950003,2008-01-1601:53:38.857,2008-01-1601:53:38.857,0x0000000002A2
homesql2008(HOMEMAK):(5row(s)affected)
圖Fig 1.2
對於SQL Server監控的每一個表,在CDC模式下都會創建一個相應的表來與之對應。這個表的命名方式為“原模式名_原表名_CT”,在這個例子中,這個對應的表叫做dbo_MyTable_CT。參考圖Fig 1.3
圖Fig 1.3
接下來我們查詢一下dbo_MyTable_CT這個表,如下所示:(參考圖Fig 1.4)
select * from cdc.dbo_MyTable_CT
執行結果
__$start_lsn,__$end_lsn,__$seqval,__$Operation,__$update_mask,ID,Name
0x0000001C0000018B002F,NULL,0x0000001C0000018B002E,2,0x03,1,DanceDoll
0x0000001C000001920003,NULL,0x0000001C000001920002,2,0x03,2,RainbowColors
0x0000001C000001930003,NULL,0x0000001C000001930002,2,0x03,3,RiverDance
0x0000001C000001940003,NULL,0x0000001C000001940002,2,0x03,4,MickeyMouse
0x0000001C000001950003,NULL,0x0000001C000001950002,2,0x03,5,UniversalStudiOS
homesql2008(HOMEMAK):(5row(s)affected)
圖Fig 1.4
第二步
我們更新表的一些數據,另外再刪除掉一些數據,如下所示:(參考圖Fig 1.5)
useMyDataBase
go
UpdateMyTablesetsalary=125000whereid=4
go
deleteMytablewhereId=4
go
執行結果
homesql2008(HOMEMAK):(1row(s)affected)
homesql2008(HOMEMAK):(1row(s)affected)
圖Fig 1.5
查詢表lsn_time_mapping,如下所示:
select * from cdc.lsn_time_mapping
執行結果
start_lsn,tran_begin_time,tran_end_time,tran_id
0x0000001C0000018B002F,2008-01-1601:53:38.840,2008-01-1601:53:38.840,0x00000000029C
0x0000001C000001920003,2008-01-1601:53:38.857,2008-01-1601:53:38.857,0x00000000029F
0x0000001C000001930003,2008-01-1601:53:38.857,2008-01-1601:53:38.857,0x0000000002A0
0x0000001C000001940003,2008-01-1601:53:38.857,2008-01-1601:53:38.857,0x0000000002A1
0x0000001C000001950003,2008-01-1601:53:38.857,2008-01-1601:53:38.857,0x0000000002A2
0x0000001C000001BB0004,2008-01-1602:08:37.357,2008-01-1602:08:37.357,0x0000000002B1
homesql2008(HOMEMAK):(6row(s)affected)
我們可以看到,在表中有一條新的lsn記錄。
查詢表cdc.dbo_MyTable_CT,如下所示
select * from cdc.dbo_MyTable_CT
執行結果
__$start_lsn,__$end_lsn,__$seqval,__$Operation,__$update_mask,ID,Name
0x0000001C0000018B002F,NULL,0x0000001C0000018B002E,2,0x03,1,DanceDoll
0x0000001C000001920003,NULL,0x0000001C000001920002,2,0x03,2,RainbowColors
0x0000001C000001930003,NULL,0x0000001C000001930002,2,0x03,3,RiverDance
0x0000001C000001940003,NULL,0x0000001C000001940002,2,0x03,4,MickeyMouse
0x0000001C000001950003,NULL,0x0000001C000001950002,2,0x03,5,UniversalStudiOS
0x0000001C000001BB0004,NULL,0x0000001C000001BB0002,1,0x03,4,MickeyMouse
homesql2008(HOMEMAK):(6row(s)affected)
我們嘗試一下更新一行,但不刪除這行。
UpdateMyTablesetsalary=1200whereid=1
UpdateMyTablesetname='abc'wherename='DanceDoll'
查詢表cdc.dbo_MyTable_CT,如下所示
select * from cdc.dbo_MyTable_CT
執行結果
__$start_lsn,__$end_lsn,__$seqval,__$Operation,__$update_mask,ID,Name
0x0000001C0000018B002F,NULL,0x0000001C0000018B002E,2,0x03,1,DanceDoll
0x0000001C000001920003,NULL,0x0000001C000001920002,2,0x03,2,RainbowColors
0x0000001C000001930003,NULL,0x0000001C000001930002,2,0x03,3,RiverDance
0x0000001C000001940003,NULL,0x0000001C000001940002,2,0x03,4,MickeyMouse
0x0000001C000001950003,NULL,0x0000001C000001950002,2,0x03,5,UniversalStudiOS
0x0000001C000001BB0004,NULL,0x0000001C000001BB0002,1,0x03,4,MickeyMouse
0x0000001C000001E40004,NULL,0x0000001C000001E40002,3,0x02,1,DanceDoll
0x0000001C000001E40004,NULL,0x0000001C000001E40002,4,0x02,1,abc
homesql2008(HOMEMAK):(8row(s)affected)
從這些數據中可以很明顯的看出,所有的數據變化都已經被捕獲。
注:本文根據SQL Server 2008-11月CTP寫作而成。
結論
本文繼續討論了如何在數據庫和表上啟動捕獲數據變化這一功能,以及對於開啟了CDC的表,SQL Server又是如何監控它們的數據變化的。在接下來的文章中,我們將討論如何以一種有效的方式取得這些數據變化。