先創建一個名為“MyDataBase“的數據庫,如下所示(參見圖Fig 1.0):
USE[master]
GO
/***Object:Database[MyDataBase]ScriptDate:01/07/200818:46:15***/
IFEXISTS(SELECTnameFROMsys.databasesWHEREname=N'MyDataBase')
DROPDATABASE[MyDataBase]
GO
USE[master]
GO
/***Object:Database[MyDataBase]ScriptDate:01/07/200818:46:33***/
CREATEDATABASE[MyDataBase]
GO
第二步
在MyDataBase數據庫中創建一個名為MyTable的表,如下所示(參見圖Fig 1.1):
USE[MyDataBase]
GO
/***Object:Table[dbo].[MyTable]ScriptDate:01/07/200818:52:14***/
IFEXISTS(SELECT*FROMsys.objectsWHEREobject_id=OBJECT_ID(N'[dbo].[MyTable]')
ANDtypein(N'U'))
DROPTABLE[dbo].[MyTable]
GO
USE[MyDataBase]
GO
/***Object:Table[dbo].[MyTable]ScriptDate:01/07/200818:52:26***/
SETANSI_NULLSON
GO
SETQUOTED_IDENTIFIERON
GO
SETANSI_PADDINGON
GO
CREATETABLE[dbo].[MyTable](
[ID][int]NOTNULL,
[Name][varchar](100)NULL,
CONSTRAINT[MyTable_PK]PRIMARYKEYCLUSTERED
(
[ID]ASC
)WITH(PAD_INDEX=OFF,STATISTICS_NORECOMPUTE=OFF,
IGNORE_DUP_KEY=OFF,ALLOW_ROW_LOCKS=ON,
ALLOW_PAGE_LOCKS=ON)ON[PRIMARY]
)ON[PRIMARY]
GO
SETANSI_PADDINGOFF
GO
第三步
為了監控表的變化,需要在數據庫上開啟變化數據捕獲功能。我們可以通過如下的SQL語句來開啟這項功能。(參見圖Fig 1.2)
到現在為止,數據庫中都只有一個模式,那就是dbo。一旦我們開啟變化數據捕獲功能,一種新的模式和一些其它的對象將被創建。
USE[MyDataBase]
GO
EXECsys.sp_cdc_enable_db_change_data_capture
GO
在CDC模式下,如下的表被創建(參見圖Fig 1.3)
cdc.captured_columns
cdc.change_tables
cdc.ddl_history
cdc.index_columns
cdc.lsn_time_mapping
當你查詢這些表的時候,你會發現這些表都是空的。(參見圖Fig 1.4)
select*fromcdc.captured_columns
select*fromcdc.change_tables
select*fromcdc.ddl_history
select*fromcdc.index_columns
select*fromcdc.lsn_time_mapping
執行結果
homesql2008(HOMEMAK):(0row(s)affected)
homesql2008(HOMEMAK):(0row(s)affected)
homesql2008(HOMEMAK):(0row(s)affected)
homesql2008(HOMEMAK):(0row(s)affected)
homesql2008(HOMEMAK):(0row(s)affected)
第三步
為了監控表的變化,還需要在表上開啟變化數據捕獲功能。我們可以通過如下語句來開啟它。(參見圖Fig 1.5)
USE [MyDataBase]
GO
EXEC sys.sp_cdc_enable_table_change_data_capture
@source_schema = 'dbo',
@source_name = 'MyTable',
@role_name = 'cdc_MyTable'
GO
執行結果
homesql2008(HOMEMAK):
Job'cdc.MyDataBase_capture'startedsuccessfully.
homesql2008(HOMEMAK):
Job'cdc.MyDataBase_cleanup'startedsuccessfully.
通過閱讀以上結果,我們很容易知道在捕獲和清空時SQL Server代理是必須的。在SQL Server的調度任務中,我們可以看到這些任務實際上被創建了。(參見圖Fig 1.6, 1.7)
現在,我們來執行如下語句,看看這些數據是否能夠插入CDC表中。
select*fromcdc.captured_columns
select*fromcdc.change_tables
select*fromcdc.index_columns
執行結果
object_id,column_name,column_id,column_type,column_ordinal,is_computed
389576426,ID,1,int,1,0
389576426,Name,2,varchar,2,0
homesql2008(HOMEMAK):(2row(s)affected)
object_id,version,source_object_id,capture_instance,start_lsn,end_lsn,supports_net_changes,has_drop_pending,
role_name,index_name,filegroup_name,create_date
389576426,0,53575229,dbo_MyTable,NULL,NULL,0,NULL,cdc_MyTable,MyTable_PK,NULL,2008-01-0719:05:49.733
homesql2008(HOMEMAK):(1row(s)affected)
object_id,column_name,index_ordinal,column_id
389576426,ID,1,1
homesql2008(HOMEMAK):(1row(s)affected)
我們可以看到,如果一個表或者列被監控,則它的元數據信息將被保存在CDC(捕獲數據變化)模式下。CDC模式也能夠存儲它所監控的索引信息。
第四步
通過如下的T-SQL語句,我們可以看到數據庫上的捕獲數據變化功能是否已經啟動。
SELECT is_cdc_enabled FROM sys.databases WHERE name = 'MyDataBase'
執行結果
is_cdc_enabled
--------------
1
homesql2008(HOMEMAK):(1row(s)affected)
第五步
使用如下的T-SQL語句,我們可以看到某個表上的捕獲數據變化功能是否已經啟動。
SELECT is_tracked_by_cdc FROM sys.tables WHERE name = 'MyTable'
執行結果
is_tracked_by_cdc
-----------------
1
homesql2008(HOMEMAK):(1row(s)affected)
第六步
接下來,我們改變一下表的結構,看看捕獲數據變化功能是否能夠捕捉到這些變化。執行如下的SQL語句,如圖Fig 1.8所示
USE[MyDataBase]
GO
AlterTableMyTableaddAddressvarchar(500)
GO
AlterTableMyTableaddSalarymoney
GO
AlterTableMyTableaddBonusmoney
GO
查詢CDC模式下的表ddl_history,如圖Fig 1.9所示
select * from cdc.ddl_history
執行結果
source_object_id,object_id,required_column_update,ddl_command,ddl_lsn,ddl_time
53575229,389576426,0,AlterTableMyTableaddAddressvarchar(500)
,0x0000001C000001350001,2008-01-0719:23:00.000
53575229,389576426,0,AlterTableMyTableaddSalarymoney
,0x0000001C000001370018,2008-01-0719:23:00.000
53575229,389576426,0,AlterTableMyTableaddBonusmoney
,0x0000001C0000013D0018,2008-01-0719:23:00.000
homesql2008(HOMEMAK):(3row(s)affected)
注:本文章基於SQL Server 2008 11月CTP。
結論
文章說明了如何在數據庫中啟動SQL Server這項新功能--捕捉數據變化,同時也講解了如何對數據表啟用這項功能,並監控表上數據定義語言的變化,並解釋了CDC模式以及該模式下各對象實現的功能。