Talvez se lembrem do meu último post sobre Change Data Control. Desta vez vou continuar a falar sobre outra opção para seguir alterações a tabelas no SQL Server: Change Tracking.
As principais diferenças entre os dois são:
- Change Tracking funciona com o SQL Server 2008 Express
- Change Tracking não requer o SQL Server Agent a correr
- Change Tracking não guarda os valores antigos no caso de um UPDATE ou DELETE
- Change Data Capture usa um processo ass´ncrono, por isso não existe overhead na operação
- Change Data Capture requere mais espaço de armazenamento e processamento
Aqui está algum código que ilustra a sua utilização:
-- para efeitos de demonstracao, a tabela Post da base de dados Blog apenas contem duas colunas, PostId e Title
-- activar change tracking para a base de dados Blog, por 2 dias
ALTER DATABASE Blog
SET CHANGE_TRACKING = ON
(CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON);
-- activar change tracking para a tabela Post
ALTER TABLE Post
ENABLE CHANGE_TRACKING
WITH (TRACK_COLUMNS_UPDATED = ON);
-- ver os registos actuais na tabela Post
SELECT * FROM Post
SELECT * FROM sys.sysobjects WHERE name = 'Post'
SELECT * FROM sys.sysdatabases WHERE name = 'Blog'
-- confirmar que a tabela Post e a a base de dados Blog estao a ser tracked
SELECT * FROM sys.change_tracking_tables
SELECT * FROM sys.change_tracking_databases
-- ver a versao actual da tabela Post
SELECT p.PostId,
p.Title,
c.SYS_CHANGE_VERSION,
c.SYS_CHANGE_CONTEXT
FROM Post AS p
CROSS APPLY CHANGETABLE(VERSION Post, (PostId), (p.PostId)) AS c;
-- actualiza a tabela Post
UPDATE Post
SET Title = 'First Post Title Changed'
WHERE Title = 'First Post Title';
-- ver a versao actual da tabela Post
SELECT p.PostId,
p.Title,
c.SYS_CHANGE_VERSION,
c.SYS_CHANGE_CONTEXT
FROM Post AS p
CROSS APPLY CHANGETABLE(VERSION Post, (PostId), (p.PostId)) AS c;
-- ver as alteracoes desde a versao 0 (inicial)
SELECT p.Title, c.PostId,
SYS_CHANGE_VERSION,
SYS_CHANGE_OPERATION,
SYS_CHANGE_COLUMNS,
SYS_CHANGE_CONTEXT
FROM CHANGETABLE(CHANGES Post, 0) AS c
LEFT OUTER JOIN Post AS p
ON p.PostId = c.PostId;
-- ver se a coluna Title da tabela Post mudou desde a versao 0?
SELECT CHANGE_TRACKING_IS_COLUMN_IN_MASK(COLUMNPROPERTY(OBJECT_ID('Post'), 'Title', 'ColumnId'), (SELECT SYS_CHANGE_COLUMNS FROM CHANGETABLE(CHANGES Post, 0) AS c))
-- obter a versao corrente
SELECT CHANGE_TRACKING_CURRENT_VERSION()
-- desactivar change tracking para a tabela Post
ALTER TABLE Post
DISABLE CHANGE_TRACKING;
-- desactivar change tracking para a base de dados Blog
ALTER DATABASE Blog
SET CHANGE_TRACKING = OFF;
Podem ler sobre as diferenças entre as duas opçes aqui. Escolham aquela que melhor serve as vossas necessidades!
Posted
1-6-2010 11:16
por
Ricardo Peres