Change Tracking – Demo

No artigo anterior (Change Tracking – Overview), tivemos uma visão geral do Change Tracking, feature presente no SQL Server 2008 e superiores.

Neste, teremos a demonstração desta feature, desde a configuração e operações básicas á sincronização de um ambiente replicado (sem a utilização do Sync Framework).

Como primeiro passo, vamos criar primeiramente um banco de dados. Em seguida, habilitar “Change Tracking” e “Snapshot Isolation” (este último, recomendável para o processo de sincronização dos dados).

Criamos uma tabela com alguns dados, e habilitamos o Change Trancking para monitorá-la:

Obtendo a versão inicial do banco de dados e a versão após INSERT/UPDATE/DELETE de alguns registos:

Obtendo informações sobre o que foi alterado na tabela “Salarios” a partir da versão “0”:

Relacionando os registros alterados por meio de um LEFT JOIN:

Obtendo mais informações:

Identificando qual a coluna atualizada numa operação de UPDATE (no caso, a coluna “Salario” foi atualizada):

Utilizando Change Context, para adicionar informações sobre a alteração realizada (no caso, PDV0029).

Replicando e sincronizando ambientes

Agora veremos um exemplo simples de ambiente replicado que após algumas alterações será sincronizado.

O primeiro passo, criar um repositório para identificar a versão inicial do ambiente no momento da importação dos dados, e outro repositório, onde ficarão estes dados.

Importação dos dados (lembrando de utilizar uma transação neste processo):

Realizando algumas operações na tabela original:

Versão do banco de dados e versão dos dados replicados:

Identificando as operações realizadas entre o banco de dados e o ambiente replicado:

Exemplo simples de sincronização dos dois ambientes:

Verificando a ressincronização:

Finishing

Finalizando a demonstração, desabilitando o Change Tracking e excluindo o banco de dados:

Script Completo

-- CT
USE [master]
GO

CREATE DATABASE CT_Demo
GO

USE CT_Demo
GO

ALTER DATABASE CT_Demo
SET CHANGE_TRACKING = ON (CHANGE_RETENTION = 2 DAYS, AUTO_CLEANUP = ON)
GO

ALTER DATABASE CT_Demo
SET ALLOW_SNAPSHOT_ISOLATION ON;
GO

CREATE TABLE Salarios (
	Codigo INT IDENTITY PRIMARY KEY,
	Empregado VARCHAR(50) NOT NULL,
	Salario MONEY,
	SalarioAnterior MONEY NULL
)
GO

INSERT INTO Salarios VALUES
('José', 1800, NULL),
('Maria', 1500, NULL),
('João', 1100, NULL)
GO

ALTER TABLE Salarios
ENABLE CHANGE_TRACKING WITH(TRACK_COLUMNS_UPDATED = ON)
GO

SELECT CHANGE_TRACKING_CURRENT_VERSION();
GO

INSERT INTO Salarios VALUES
('Pedro', 1800, NULL)
GO

UPDATE Salarios
SET Salario = 2100,
SalarioAnterior = Salario
WHERE Empregado = 'José'
GO

DELETE Salarios
WHERE Empregado = 'João'
GO

SELECT CHANGE_TRACKING_CURRENT_VERSION();
GO

DECLARE @SINC BIGINT
SET @SINC = 0

SELECT *
FROM CHANGETABLE(CHANGES Salarios, @SINC) AS CT
GO

DECLARE @SINC BIGINT
SET @SINC = 0

SELECT S.*, CT.*
FROM CHANGETABLE(CHANGES Salarios, @SINC) AS CT
LEFT JOIN Salarios S
ON S.Codigo = CT.Codigo
GO

DECLARE @SINC BIGINT
SET @SINC = 0

DECLARE @SalarioColumnId INT
SET @SalarioColumnId = COLUMNPROPERTY(
		OBJECT_ID('Salarios'),
		'Salario',
		'ColumnId'
	)

DECLARE @EmpregadoColumnId INT
SET @EmpregadoColumnId = COLUMNPROPERTY(
		OBJECT_ID('Salarios'),
		'Empregado',
		'ColumnId'
	)

SELECT
SalarioAlterado =
	CHANGE_TRACKING_IS_COLUMN_IN_MASK(@SalarioColumnId, CT.SYS_CHANGE_COLUMNS),
EmpregadoAlterado =
	CHANGE_TRACKING_IS_COLUMN_IN_MASK(@EmpregadoColumnId, CT.SYS_CHANGE_COLUMNS),
CT.*
FROM CHANGETABLE(CHANGES Salarios, @SINC) AS CT
WHERE SYS_CHANGE_OPERATION = 'U'
GO

DECLARE @ID VARBINARY(128) = CAST('PDV0029' AS VARBINARY)

;WITH CHANGE_TRACKING_CONTEXT(@ID)

INSERT INTO Salarios VALUES
('Heitor', 850, 650)

DECLARE @SINC BIGINT
SET @SINC = 0

SELECT
CAST(CT.SYS_CHANGE_CONTEXT AS VARCHAR),
S.*,
CT.*
FROM CHANGETABLE(CHANGES Salarios, @SINC) AS CT
LEFT JOIN Salarios S
ON S.Codigo = CT.Codigo
GO

CREATE TABLE SalariosVersao (Versao BIGINT)
GO

CREATE TABLE SalariosCopy (
	Codigo INT PRIMARY KEY,
	Empregado VARCHAR(50) NOT NULL,
	Salario MONEY,
	SalarioAnterior MONEY NULL
)
GO

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN

INSERT INTO SalariosVersao
VALUES (CHANGE_TRACKING_CURRENT_VERSION())

INSERT INTO SalariosCopy
SELECT * FROM Salarios

COMMIT TRAN

GO

INSERT INTO Salarios VALUES
('Carlos', 1000, 980)
GO

DELETE Salarios
WHERE Empregado = 'Heitor'
GO

UPDATE Salarios
SET Salario = 2200,
SalarioAnterior = Salario
WHERE Empregado = 'José'
GO

SELECT CHANGE_TRACKING_CURRENT_VERSION();

SELECT Versao FROM SalariosVersao
GO

DECLARE @SINC BIGINT
SELECT @SINC = Versao FROM SalariosVersao

SELECT
CAST(CT.SYS_CHANGE_CONTEXT AS VARCHAR),
S.*,
CT.*
FROM CHANGETABLE(CHANGES Salarios, @SINC) AS CT
LEFT JOIN Salarios S
ON S.Codigo = CT.Codigo
GO

SET TRANSACTION ISOLATION LEVEL SNAPSHOT;
BEGIN TRAN

DECLARE @SINC BIGINT
SELECT @SINC = Versao FROM SalariosVersao

DELETE S
FROM CHANGETABLE(CHANGES Salarios, @SINC) AS CT
LEFT JOIN SalariosCopy S
ON S.Codigo = CT.Codigo
WHERE SYS_CHANGE_OPERATION IN ('U', 'D')

INSERT INTO SalariosCopy
SELECT S.*
FROM CHANGETABLE(CHANGES Salarios, @SINC) AS CT
LEFT JOIN Salarios S
ON S.Codigo = CT.Codigo
WHERE CT.SYS_CHANGE_OPERATION IN ('I', 'U')

UPDATE SalariosVersao
SET Versao = CHANGE_TRACKING_CURRENT_VERSION()

COMMIT TRAN

SELECT *
FROM Salarios

SELECT *
FROM SalariosCopy

GO

ALTER TABLE Salarios
DISABLE CHANGE_TRACKING
GO

ALTER DATABASE CT_Demo
SET CHANGE_TRACKING = OFF
GO

USE [master]
GO

DROP DATABASE CT_Demo
GO

3 pensamentos sobre “Change Tracking – Demo

  1. Pingback: Centro de Treinamento SQL Server 2008 R2 « SQL From Hell.com

Deixe uma resposta

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s