MSSQL CDC (CHANGE DATA CAPTURE)

CodeProject üzerinde bulduğum güzel bir yazı üzerine konuşuyor olacağız..

Link

Muhtemelen tıklanma rekoru kıran bu yazı MSSQL in tablo üzerindeki veri değişimlerini trace edebileceğimiz CDC(Change Data Capture) özelliğine anlatmakta. Dilerseniz başlayalım...

Trace edebilmemiz için önce bir tablo oluşturmamız lazım..



IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[MyTable]')
AND type in (N'U'))
DROP TABLE [dbo].[MyTable]
GO

GO

/*** Object: Table [dbo].[MyTable] Script Date: 01/07/2008 18:52:26 ***/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

SET ANSI_PADDING ON
GO

CREATE TABLE [dbo].[MyTable](
[ID] [int] NOT NULL,
[Name] [varchar](100) NULL,
CONSTRAINT [MyTable_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]



Yazımızdaki tabloyu aldık.. Bu tablo üzerinde CDC yapabilmemiz için enable fonksiyonumuz var..



EXEC sys.sp_cdc_enable_table
@source_schema ='dbo',
@source_name ='MyTable',
@role_name ='MyTableRole',
@supports_net_changes = 1



Akabinde tablomuzda cdc in enable olup olmadığını check edelim..



SELECT name,is_tracked_by_cdc FROM sys.tables WHERE name='MyTable'



is_tracked_by_cdc i 1 olarak gördük.. Bu şekilde tablomuz takipte..

Bir kaç update ve delete işlemi yaptıktan sonra aşağıdaki kodları deneyelim..



DECLARE @begin_time datetime, @end_time datetime, @from_lsn binary(10), @to_lsn binary(10);
SET @end_time = GETDATE();
SELECT @from_lsn = sys.Fn_cdc_map_time_to_lsn('smallest greater than or equal',GETDATE()-2) -- Burada geri gitmek istediğimiz değer kadar geri gidebiliriz..

SELECT @to_lsn = sys.Fn_cdc_map_time_to_lsn('largest less than or equal',GETDATE())
-- Bugün itibari ile neler değişmiş bakabiliyoruz

declare @row_filter nvarchar(30)
Set @row_filter ='all';

SELECT * FROM cdc.fn_cdc_get_all_changes_dbo_MyTable(@from_lsn,@to_lsn,'All');
-- All changes veya Net changes diyebilirdik..


Üstteki kodda zaman aralıkları vererek get_net_changes ile net değişikleri all_changes ile de tüm operasyonları görebilmekteyiz..

Yada CT tablosunu aşağıdaki gibi query ederek de sonuca ulaşabilirdik....



Select * FROM cdc.dbo_MyTable_CT




Herkesi İyi Çalışmalar..

Yorumlar

Bu blogdaki popüler yayınlar

ORA-00054: resource busy and acquire with NOWAIT specified

NODE.JS Örnek Uygulama - TIC TAC TOE -1 (Server)