程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2008新功能 捕獲數據變化(1)

SQL Server 2008新功能 捕獲數據變化(1)

編輯:關於SqlServer
 第一步

  先創建一個名為“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

SQL Server 2008新功能 捕獲數據變化(1)

  在CDC模式下,如下的表被創建(參見圖Fig 1.3)

  cdc.captured_columns

  cdc.change_tables

  cdc.ddl_history

  cdc.index_columns

  cdc.lsn_time_mapping

SQL Server 2008新功能 捕獲數據變化(1)

  當你查詢這些表的時候,你會發現這些表都是空的。(參見圖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

SQL Server 2008新功能 捕獲數據變化(1)

  查詢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模式以及該模式下各對象實現的功能。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved