Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
Here are some notes on "SQL Server 2008 Change Tracking (CT) and Change Data Capture (CDC)" I took while attending an advanced class on SQL Server taught by Paul Nielsen (from https://www.sqlserverbible.com).
Please note that, although these notes were taken during the class, I might have added some of my own (mis)interpretation :-). Always check your facts on Books Online (I try to provide links when applicable). As with anything else you get from a blog, never use any of this in production before you thoroughly validate it a test environment. Please keep in mind that some of those will be hard to follow without some pre-requisite knowledge and the right context. Reading the post from top to bottom will help.
Auditing and Monitoring
- Before SQL Server 2000: Profiler/Trace, after triggers, sysmon/perfmon, error log
- SQL Server 2000 and later: C2Audit, Security Login to Logs
- SQL Server 2005 and later: Triggers (instead of, logon, DDL), CommonCriteria, DMVs, BBTrace, Event Notification
- SQL Server 2008 and later: Change Tracking, CDC, Extended Events, SQLAudit, MDW/Collector, PBM
Change Tracking
- Change Tracking is lightweight, easy to implement, good for synching/ETL
- Change Tracking is synchronous, happens as part of the transaction
- Change Tracking not good for auditing, limited context info
- Change Tracking main use cases ETL update / custom synch with offline app
- Change Tracking set up with ALTER DATABASE / ALTER TABLE
- Query with functions
- Test for column changes, store context info from app code
- Use SNAPSHOT ISOLATION to avoid version changes during the operation
Change Tracking – Demo - Database
- ALTER DATABASE name SET CHANGE_TRACKING=ON
- (CHANGE_RETENTION=24 HOURS, AUTO_CLEANUP=ON)
- Need to pull the data every 24 hours, so you don’t lose any changes
- You can change settings and disable it
- Check with Select * from sys.change_tracking_databases
- Can also be configured/changed with SSMS
- See https://msdn.microsoft.com/en-us/library/bb964713.aspx
Change Tracking – Demo – Table
- ALTER TABLE name ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED=ON)
- Primary key required on the table
- For all tables: EXEC sp_MSforeachtable ‘ALTER TABLE ? ENABLE CHANGE_TRACKING WITH (TRACK_COLUMNS_UPDATED=ON)’
- Check with sys.internal_tables, sys.change_tracking_tables – can find the actual table used for tracking
- Current version via change_tracking_current_version() – database wide, starts with 0
- Can also be configured/changed with SSMS
- See https://msdn.microsoft.com/en-us/library/bb933949.aspx
Change Tracking – Demo – Synchronization
- Using change tracking to update synch changes from offline application
- Set it up, insert a few rows in a table
- Select * from CHANGETABLE(CHANGES table, version)
- Select change_tracking_min_valid_version
- Created SP to update main table with a MERGE statement, keep track with last version
- Made changes, synched, checked if it worked with a FULL OUTER JOIN
- Used CHANGE_TRACKING_IS_COLUMN_IN_MASK, sys_change_columns to find out which columns changed
- Used CHANGETABLE(VERSION table…
- Set security context WITH CHANGE_TRACKING_CONTEXT (string) DML
- Query later in ApplicationContext column in change table
Change Data Capture – CDC
- Efficient for ETL, Enterprise Edition Only, Uses Transaction Log
- Asynchronous, incremental data changes, requires SQL Server agent
- Job that pulls off the transaction log and writes to specific tables
- There’s still a performance hit, but could be used for OLTP
- Will hold the log until it is consumed by the async job.
- White Paper at https://msdn.microsoft.com/en-us/library/dd266396.aspx
CDC – Setup for DB
- Enable on DB: sys.sp_cdc_enable_db
- Query status on DB: sys.databases.is_cdc_enabled
- Disable for a database: sys.sp_cdc_disable_db
- See https://msdn.microsoft.com/en-us/library/cc627369.aspx
CDC – Setup for table
- Enable for table: sp_cdc_enable_table
- Disabling for table: sp_cdc_disabe_table
- Creates two jobs – Capture and cleanup
- Creates a system table – cdc.schema_table_ct
- Same columns as base table, plus _$start_lsn, _$end_lsn, _$operation, _$seqval, _$updatemask
CDC functions
- Sys.fn_cdc_map_time_to_lsn(relational operator, time)
- Sys.fn_cdc_map_lsn_to_time
- Sys.fn_cdc_increment_lsn
- Sys.fn_cdc_decrement_lsn
- Sys.fn_cdc_get_max_lsn
- Sys.fn_cdc_get_min_lsn
- fn_cdc_get_all_changes_schema_table
- fn_cdc_get_net_change_schema_table
- sys.fn_cdc_is_bit_set
- Sys.fn_cdc_get_column_ordinal
- See https://msdn.microsoft.com/en-us/library/cc645858.aspx
Comparing CDC and CT
- CDC uses the transaction log, CT does not
- CDC is asynchronous (after transaction), CT is synchronous (during transaction)
- CDC is configured with SP, CT uses ALTER …
- CDC depends on SQL Agent, CT does not
- See https://msdn.microsoft.com/en-us/library/cc280519.aspx
Nielsen’s own: AutoAudit
- Third-party tool to generate audit trail triggers (use with care, read the fine print)
- SQL Server (2005, 2008) Code-Gen utility that creates Audit Trail Triggers with:
- - Created, Modified, and RowVersion (incrementing INT) columns to table
- - view to reconstruct deleted rows
- - UDF to reconstruct Row History
- - Schema Audit Trigger to track schema changes
- - Re-code-gens triggers when Alter Table changes the table
- Available from Codeplex at https://autoaudit.codeplex.com/
- See https://sqlblog.com/blogs/paul_nielsen/archive/2007/01/15/codegen-to-create-fixed-audit-trail-triggers.aspx
Comments
- Anonymous
January 01, 2003
PingBack from http://servercoach.com/?p=1230 - Anonymous
January 01, 2003
I took some advanced SQL Server 2008 classes recently and shared my notes in a series of blog posts.