天天看點

SQL Server2008新功能 捕獲資料變化

微軟介紹了SQL Server 2008的一項新功能:捕獲資料變化。捕獲資料變化功能可以友善地監控到表的變化。本文的第一、二部分介紹了怎樣在資料庫及表上開啟捕獲資料變化功能。下面将介紹的是,如果表的結構發生變化,捕獲資料變化功能将有什麼樣的表現。

  注:本文章基于SQL Server 200811月CTP。

  第一步

  用下面的代碼建立一個名為“CDCDB”的資料庫。

  USE [master]

  GO

  

  IF EXISTS (SELECT name FROM sys.databases WHERE name = N'CDCDB')

  DROP DATABASE [CDCDB]

  GO

  USE [master]

  GO

  

  CREATE DATABASE [CDCDB]

  GO

  第二步

  建立一個名為Employee的表,代碼如:

  use [CDCDB]

  go

  

  IF EXISTS (SELECT * FROM sys.objects

  WHERE object_id = OBJECT_ID(N'[dbo].[Employee]')

  AND type in (N'U'))

  DROP TABLE [dbo].[Employee]

  GO

  use [CDCDB]

  go

  

  SET ANSI_NULLS ON

  GO

  SET QUOTED_IDENTIFIER ON

  GO

  SET ANSI_PADDING ON

  GO

  CREATE TABLE [dbo].[Employee](

  [ID] [int] NOT NULL,

  [Name] [varchar](100) NULL,

  CONSTRAINT [Employee_PK] PRIMARY KEY CLUSTERED

  (

  [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

  SET ANSI_PADDING OFF

  GO

  第三步

  在資料庫“CDCDB”上開啟捕獲資料變化功能,如下:

  USE [CDCDB]

  GO

  EXEC sys.sp_cdc_enable_db_change_data_capture

  GO

  第四步

  在表“Employee”上開啟捕獲資料變化功能,如下:

  use [CDCDB]

  go

  GO

  EXEC sys.sp_cdc_enable_table_change_data_capture

  @source_schema = 'dbo',

  @source_name = 'Employee',

  @role_name = 'cdc_Employee'

  GO

第五步

  開啟了捕獲資料變化功能後,在表“Employee”上增加幾列,如下:

  use [CDCDB]

  go

  GO

  Alter Table Employee add Address varchar(500)

  GO

  Alter Table Employee add Salary money

  GO

  Alter Table Employee add Bonus money

  GO

  第六步

  向表中插入一些資料。

  use [CDCDB]

  go

  select * from Employee

  go

  Insert into Employee values (1, 'Dancing Doll','221, West Broad st,

  Greenbay, Wisconsin',60000,1000)

  Insert into Employee values (2, 'Rainbow Dance','21, East st,

  Denville, New Jersey',68000,1300)

  Insert into Employee values (3, 'Water Dance','1, South Broad st,

  Quincy, Massachusetts',76000,1600)

  Insert into Employee values (4, 'Mickey Mouse','5, Main,

  Greenbay, Wisconsin',120000,12000)

  Insert into Employee values (5, 'Rat year','7, New road,

  Danbury , Connecticut',45000,1600)

  go

  select * from Employee

  go

  執行結果

  ID, Name, Address, Salary, Bonus

  home/sql2008(HOME/MAK): (0 row(s) affected)

  home/sql2008(HOME/MAK): (1 row(s) affected)

  home/sql2008(HOME/MAK): (1 row(s) affected)

  home/sql2008(HOME/MAK): (1 row(s) affected)

  home/sql2008(HOME/MAK): (1 row(s) affected)

  home/sql2008(HOME/MAK): (1 row(s) affected)

  ID, Name, Address, Salary, Bonus

  1, Dancing Doll, 221, West Broad st,

  Greenbay, Wisconsin, 60000.0000, 1000.0000

  2, Rainbow Dance, 21, East st,

  Denville, New Jersey, 68000.0000, 1300.0000

  3, Water Dance, 1, South Broad st,

  Quincy, Massachusetts, 76000.0000, 1600.0000

  4, Mickey Mouse, 5, Main,

  Greenbay, Wisconsin, 120000.0000, 12000.0000

  5, Rat year, 7, New road,

  Danbury , Connecticut, 45000.0000, 1600.0000

  home/sql2008(HOME/MAK): (5 row(s) affected)

  第七步

  更新及删除一些資料,如下:

  use [CDCDB]

  go

  Update Employee set name='test' where id =5

  go

  Delete Employee where id in (3,4)

  Go

  第八步

  通過以下查詢語句檢視DDL和DML的變化。[參考圖 Fig 1.0 and Fig 1.1]

  use [CDCDB]

  go

  select * from cdc.ddl_history

  go

  執行結果   source_object_id, object_id, required_column_update, ddl_command, ddl_lsn, ddl_time

  565577053, 597577167, 0, Alter Table Employee add Address varchar(500)

  , 0x000000360000006B0022, 2008-02-09 15:03:00.000

  565577053, 597577167, 0, Alter Table Employee add Salary money

  , 0x000000360000007A0018, 2008-02-09 15:03:00.000

  565577053, 597577167, 0, Alter Table Employee add Bonus money

  , 0x00000036000000800018, 2008-02-09 15:03:00.000

  home/sql2008(HOME/MAK): (3 row(s) affected)

SQL Server2008新功能 捕獲資料變化

  圖Fig 1.0

  use [CDCDB]

  go

  Select case __$operation when 1 then 'Deleting'

  when 2 then 'Inserting'

  when 3 then 'Value before Update'

  when 4 then 'Value after Update'

  when 5 then 'Merge' end ,__$update_mask,ID,Name

  from cdc.dbo_Employee_CT

  go

  執行結果

  , __$update_mask, ID, Name

  Inserting, 0x03, 1, Dancing Doll

  Inserting, 0x03, 2, Rainbow Dance

  Inserting, 0x03, 3, Water Dance

  Inserting, 0x03, 4, Mickey Mouse

  Inserting, 0x03, 5, Rat year

  Value before Update, 0x02, 5, Rat year

  Value after Update, 0x02, 5, test

  Deleting, 0x03, 3, Water Dance

  Deleting, 0x03, 4, Mickey Mouse

  home/sql2008(HOME/MAK): (9 row(s) affected)

SQL Server2008新功能 捕獲資料變化

  圖Fig 1.1

  從以上的結果中,我們可以看出隻有ID和Name這2列被監控到了,開啟資料捕獲功能之後增加的所有列都内有被監控到。      第九步

  現在我們對所有列進行資料捕獲。先關閉目前的資料捕獲功能,再打開資料捕獲功能就可以了。使用下面的語句關閉目前功能:

  use [CDCDB]

  go

  EXEC sys.sp_cdc_disable_table_change_data_capture

  @source_schema = 'dbo',

  @source_name = 'Employee',

  @capture_instance = 'dbo_Employee'

  Go

  第十步

  使用如下T-SQL語句在表“Employee”上開啟捕獲資料變化功能。這次我們想檢視到哪些列被監控了。

  use [CDCDB]

  go

  EXEC sys.sp_cdc_enable_table_change_data_capture

  @source_schema = 'dbo',

  @source_name = 'Employee',

  @role_name = 'cdc_Employee',

  @captured_column_list = N'ID, Name, Salary,Bonus'

  GO

  查詢捕獲資料變化模式下Empolyee表的變化,如下:

  use [CDCDB]

  go

  select * from cdc.dbo_Employee_CT

  go

  執行結果顯示,Empolyee表的所有列都被監控了。(參考圖 Fig 1.2)

SQL Server2008新功能 捕獲資料變化

  圖 Fig 1.2

  結論

  為了更好的監控表結構的變化,我們可以在适當的時候關閉或開啟資料庫上的捕獲資料變化功能。